黑马程序员技术交流社区

标题: C--坐等!请教一下如何给struct数组里char*元素赋值 [打印本页]

作者: Micro    时间: 2015-2-6 15:02
标题: C--坐等!请教一下如何给struct数组里char*元素赋值
本帖最后由 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;
}
我的会报错。求正确答案。
作者: 邓士林    时间: 2015-2-6 15:02
好久没搞C语言了,都忘了,问题应该是你没给char * name分配内存吧!
stu[0].name =(char *)malloc(sizeof(char));一般用数组就好了。

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

111.png

作者: Micro    时间: 2015-2-6 20:22
邓士林 发表于 2015-2-6 17:16
好久没搞C语言了,都忘了,问题应该是你没给char * name分配内存吧!
stu[0].name =(char *)malloc(sizeof( ...

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

以上是本人推测。
作者: Micro    时间: 2015-2-7 13:11
蜡笔3285 发表于 2015-2-7 13:07
这里的char*指令分配的是一个8字节的指针,他指向别的存储单元,但是这个存储单元的大小并没有确定。
① sc ...

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

谢谢,但是我需要 char *name ,这样的写法。char name[20],这样子就固定大小了。。。不过你的建议很好。{:3_57:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2