C/C++ 编程问题求助

gstatham 2018-11-26 10:59:06
请大家帮忙看下,下面的代码,为什么那两处是段错误呢?是什么原因导致的?特别是第2个,已经malloc了,为什么还不行呢?感激不尽

typedef struct stu{
char *name;
int age;
}stu;

stu *st;

int main()
{
char name[8] = "xiaohua";

// st->age = 1; //Segmentation fault
// printf("age=%d\n", st->age);


st = (struct stu *)malloc(sizeof(struct stu)) ;

st->age = 1;
printf("age=%d\n", st->age);


st->name = "xiaohua";
printf("%s\n", st->name);

//memcpy(st->name, name, sizeof(name)); //Segmentation fault
//printf("%s\n", st->name);

st->name = (char *)malloc(32);
memcpy(st->name, name, sizeof(name));
printf("%s\n", st->name);


free(st);
return 0;
}
...全文
455 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
懒得上楼 2018-12-07
  • 打赏
  • 举报
回复
你都放到malloc后面就不会了阿,我已经试过了,用C是可以的 但是 C的话,st->name没有释放,有内存泄露 C++的话,有回收机制,你释放st的时候,st->name指向的地址会在这段代码空间结束时被回收 但是最好还是要释放一下,先释放st->name再释放st,不让free也会报断错误
water-moon 2018-11-30
  • 打赏
  • 举报
回复
第一处就不说了,你自己也知道没有分配内存; 第二处 st 指针虽然分配了内存,但是 st->name, name 是没有分配空间的, 故会出现段错误。 可能你会被 st->name = "xiaohua"; 这一句误解, "xiaohua" 这是个常量字符串, 这一句只是把这个字符串(存放在静态存储区)的地址赋值给 name, 也就是 name 指针指向静态存储区 "xiaohua", 故能打印出来。但 name 毕竟指向的是一个静态存储区啊,这是只读区,写时就会产生段错误。 你这么写是可以的: st->name = name; memcpy(st->name, "hhaha", sizeof(name));
mx_try 2018-11-28
  • 打赏
  • 举报
回复
分配stu的内存,但是系统又怎么知道你分配的成员变量name内存是多少?照你这样,如果给name变量拷贝一个非常大的内存,岂不是也可以?
诺水城子 2018-11-28
  • 打赏
  • 举报
回复
char *name 没有分配地址,*st你malloc了,这是*st指向的地址,但是成员指针*name指向地址没有malloc,当然会段错误了
英雄@末路 2018-11-28
  • 打赏
  • 举报
回复
第一个结构指针没分配内存
第二个成员指针没分配内存
另外你最后那个成员指针分配内存没释放,有内存泄漏
st, st->name 都要分配,释放(注意顺序啊)
guolisong 2018-11-27
  • 打赏
  • 举报
回复
你只分配了stu的内存,它的成员变量name也是指针,你没有对它进行内存分配啊,所以,它还是野指针。你单步调试,看一下变量内容就知道了。解决办法就是对name也malloc一下,就没有问题了。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧