请问以下代码有什么区别么,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++ 风格的 // 注释符。