A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
本帖最后由 Micro 于 2015-2-6 15:08 编辑

#include<stdio.h>

struct student{
    char * name;
    int age;
    int no;

}stu[50];
int main(){

    scanf("%s",stu[0].name);

  printf("name is %s",stu[0].name);

    return 0;
}
我的会报错。求正确答案。

最佳答案

查看完整内容

好久没搞C语言了,都忘了,问题应该是你没给char * name分配内存吧! stu[0].name =(char *)malloc(sizeof(char));一般用数组就好了。

9 个回复

倒序浏览
好久没搞C语言了,都忘了,问题应该是你没给char * name分配内存吧!
stu[0].name =(char *)malloc(sizeof(char));一般用数组就好了。

111.png (10.27 KB, 下载次数: 43)

111.png

点评

这样后面如果有东西的话,是不是就被你直接覆盖了。。你只给分了一个char的空间。。  发表于 2015-3-27 15:01
回复 使用道具 举报
邓士林 发表于 2015-2-6 17:16
好久没搞C语言了,都忘了,问题应该是你没给char * name分配内存吧!
stu[0].name =(char *)malloc(sizeof( ...

感谢,你的回答正是我想要的。完美解决。想问一下,为什么它就是分配内存才能存进去。而像 stu[n].age 就可以直接存进去呢?
回复 使用道具 举报
这里的char*指令分配的是一个8字节的指针,他指向别的存储单元,但是这个存储单元的大小并没有确定。
① scanf指令对存储单元(字符串)的操作肯定是要求知道其大小的,不然输入一个过长的字符串不是把别的内容给覆盖了?
② stu[0].name=“this is a string” 实际上分配了一块确定大小的内存块。

以上是本人推测。

点评

1,不是要知道大小吧,他就是直接覆盖的。。不能scan是你根本没给他空间,不知道往哪存呢。。 2.并不是分配了内存块,而是指向了字符串常量。  发表于 2015-3-27 15:00
回复 使用道具 举报
蜡笔3285 发表于 2015-2-7 13:07
这里的char*指令分配的是一个8字节的指针,他指向别的存储单元,但是这个存储单元的大小并没有确定。
① sc ...

{:3_57:}感谢
回复 使用道具 举报
cly成子 来自手机 中级黑马 2015-2-7 15:50:38
地板
这个已解决是自动生成的?还是楼主得到解答后自己设置的?有点不懂!
回复 使用道具 举报
orsoul 中级黑马 2015-2-13 00:13:03
7#
最佳答案有问题。
stu[0].name =(char *)malloc(sizeof(char));//这条语句只开辟了一个字节的内存空间
scanf("%s",stu[0].name);//这条语句是将从键盘录入的字符串存入这1个字节空间中
这样的代码编译器不会报错,但程序运行后会将字录入的符串存入这1个字节及其后续的空间中,这有可能会破坏内存中的其他内容。
建议将结构体中的name属性改成数组,如char name[20]。
回复 使用道具 举报
Micro 高级黑马 2015-2-14 22:17:57
8#
orsoul 发表于 2015-2-13 00:13
最佳答案有问题。
stu[0].name =(char *)malloc(sizeof(char));//这条语句只开辟了一个字节的内存空间
scan ...

谢谢,但是我需要 char *name ,这样的写法。char name[20],这样子就固定大小了。。。不过你的建议很好。{:3_57:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马