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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  1. #include <stdio.h>

  2. int main()
  3. {
  4.     struct Student
  5.     {
  6.         
  7.         
  8.         int age;
  9.         char *name;
  10.     };
  11.    
  12.     struct Student stu;  //struct Stuetn stu
  13.    
  14.     printf("请输入年龄:\n");
  15.     scanf("%d", &stu.age);
  16.     printf("请输入姓名:\n");
  17.     scanf("%s", stu.name);
  18.     printf("name = %s, age = %d\n",stu.name , stu.age);
  19.     return 0;
  20. }
复制代码
这段代码的运行结果是正常的:


但如果代码是这样的,运行就出问题了!!请教这时为什么啊?

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     struct Student
  5.     {
  6.         
  7.         
  8.         
  9.         char *name;
  10.         int age;
  11.     };
  12.    
  13.     struct Student stu;  //struct Stuetn stu
  14.    
  15.     printf("请输入年龄:\n");
  16.     scanf("%d", &stu.age);
  17.     printf("请输入姓名:\n");
  18.     scanf("%s", stu.name);
  19.     printf("name = %s, age = %d\n",stu.name , stu.age);
  20.     return 0;
  21. }
复制代码
运行结果是:

7 个回复

倒序浏览
char *name; 最好定义个字符数组,单纯的指针放在这往里存字符串除了第一个字符其余的内存都是“野”的 有隐患的
回复 使用道具 举报
struct Student
    {
        char *name;
        int age;
    };
这是定义结构体类型,在这个过程中不会分配存储空间
printf("请输入年龄:\n");
    scanf("%d", &stu.age);
    printf("请输入姓名:\n");
    scanf("%s", stu.name);
这意味着访问结构体内部变量,意味着定义了结构体变量,这个过程分配开始分配存储空间,先分配给name,再分配给age,是有顺序的
而你先访问的是age,此时age并没有分存储空间,也就是说,你先访问的变量是最后一个加载的,所以会错误,所以记住:由于结构体分配有顺序,所以,先分配的先访问,我想,这下你应该彻底明白了
回复 使用道具 举报
万雷 发表于 2014-12-20 00:48
struct Student
    {
        char *name;

哇,学到了,还有这个关系在里面呀,所以就是第一次访问的时候内部数据顺序一定要和访问顺序一致,当内存地址分配好了之后顺序就无所谓了吧。
回复 使用道具 举报
万雷 发表于 2014-12-20 00:48
struct Student
    {
        char *name;

  1. #include <stdio.h>
  2. int main()
  3. {
  4.   typedef  struct Person
  5.     {
  6.         
  7.         char *name;
  8.         int age;
  9.     }Person;
  10.    
  11.    
  12.     //定义变量就已经分配存储空间
  13.     Person p;
  14.     int m = sizeof(p);
  15.     printf("%d\n",m);
  16.    
  17.    
  18.     return 0;
  19. }
复制代码



这说明,再定义变量的时候,就已经分配好空间了啊
回复 使用道具 举报
万雷 发表于 2014-12-20 00:48
struct Student
    {
        char *name;

就算是先访问第一个元素也是错误的哟!请看这段代码

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     struct Student
  5.     {
  6.         
  7.         
  8.         
  9.         char *name;
  10.         int age;
  11.     };
  12.    
  13.     struct Student stu;  //struct Stuetn stu
  14.     printf("请输入姓名:\n");
  15.     scanf("%s", stu.name);
  16.    
  17.     printf("请输入年龄:\n");
  18.     scanf("%d", &stu.age);
  19.    
  20.     printf("name = %s, age = %d\n",stu.name , stu.age);
  21.     return 0;
  22. }

复制代码



回复 使用道具 举报
邓明 中级黑马 2014-12-20 09:41:06
7#
我觉得这应该跟char *的特性有关
因为char *作为字符串其实是没有长度限制的,但是在内存里只占8个字节,因此实际里面存的还是地址
但是问题就来了,如果先有char *再有int,那取值的时候char *取多长的长度?
而先有int再有char *就好办了,直接取到最后面就行了
回复 使用道具 举报
理论上来说,楼主给出的两段代码运行都是没有结果的,
char * 只是表示一个引用,指向的数据空间已不属于该结构体,在使用之前需要为之分配空间。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马