请问以下代码有什么区别么,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这个字符串的地址。