首页 > 请问以下4种关于struct的定义和使用有什么区别么?

请问以下4种关于struct的定义和使用有什么区别么?

请问以下代码有什么区别么,4种方法做的同样的事情。 另外请问newuser中的name是一个指针,在用的时候需要先malloc分配内存么?我在下面的例子中直接赋值了,从结果上看并没有什么问题。

C语言新手,感谢关注。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct user{
    char name[20];
    int age;
}user;

typedef struct user2{
    char* name;
    int age;
}newuser;

int main(){
    // 示例1
    user u1;
    u1.age = 18;
    strlcpy(u1.name, "xiaoming", sizeof(u1.name));
    printf("u1: age=%d, name=%s \n", u1.age, u1.name);
    // 示例1-2
    user *u2;
    u2 = (user *)malloc(sizeof(user));
    u2->age = 18;
    strlcpy(u2->name, "xiaoming", sizeof(u2->name));
    printf("u2: age=%d, name=%s \n", u2->age, u2->name);
    // 示例2
    newuser u3;
    u3.age = 18;
    u3.name = "xiaoming";
    printf("u3: age=%d, name=%s \n", u3.age, u3.name);
    // 示例2-2
    newuser *u4;
    u4 = (newuser *)malloc(sizeof(newuser));
    u4->age = 18;
    u4->name = "xiaoming";
    printf("u4: age=%d, name=%s \n", u4->age, u4->name);

    return 0;
}

user 结构体包含了 name 成员的存储空间,写入时需要将数据复制过去。而 newuser 只包含一个指针,多了一层间接,它只说明 name 实际上(对人来说有用)的数据的内存地址。所以后者使用的时候你的字符串得是准备好了的,直接把它的地址赋值给 newuser.name 就可以了(所以,如果你使用字面量赋值的话,这个字符数组的内容是只读的;如果你的字符数组是 malloc 来的,要注意在还要用 newuser 的时候不要不小心把它 free 掉了)。

另外,我不建议使用 strlcpy 之类的函数,因为它是 BSD 系统的,非 BSD 系统需要额外的库或者自己提供实现。而类似的 strncpy 是由多个标准指定的(SVr4, 4.3BSD, C89, C99),可用性更好。

在 C 语言中不需要对 malloc 的返回值进行转换。不推荐在 C 语言中使用 C++ 风格的 // 注释符。


user和newuser定义的变量占用的内存大小是不同的,你可以用sizeof试试看。

u3.name = "xiaoming";

xiaoming这个字符串是存储在常量区的,u3.name是一个指针,存储的是xiaoming这个字符串的地址。

【热门文章】
【热门文章】