黑马程序员技术交流社区

标题: 请教一个貌似很有深度的问题,老师这里没有讲到 [打印本页]

作者: gululu23    时间: 2014-12-20 00:28
标题: 请教一个貌似很有深度的问题,老师这里没有讲到

  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. }
复制代码
运行结果是:

作者: 从今以后    时间: 2014-12-20 00:40
char *name; 最好定义个字符数组,单纯的指针放在这往里存字符串除了第一个字符其余的内存都是“野”的 有隐患的
作者: 万雷    时间: 2014-12-20 00:48
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 01:03
万雷 发表于 2014-12-20 00:48
struct Student
    {
        char *name;

哇,学到了,还有这个关系在里面呀,所以就是第一次访问的时候内部数据顺序一定要和访问顺序一致,当内存地址分配好了之后顺序就无所谓了吧。
作者: gululu23    时间: 2014-12-20 08:39
万雷 发表于 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. }
复制代码



这说明,再定义变量的时候,就已经分配好空间了啊
作者: gululu23    时间: 2014-12-20 08:48
万雷 发表于 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
我觉得这应该跟char *的特性有关
因为char *作为字符串其实是没有长度限制的,但是在内存里只占8个字节,因此实际里面存的还是地址
但是问题就来了,如果先有char *再有int,那取值的时候char *取多长的长度?
而先有int再有char *就好办了,直接取到最后面就行了
作者: 。烊了    时间: 2014-12-20 10:25
理论上来说,楼主给出的两段代码运行都是没有结果的,
char * 只是表示一个引用,指向的数据空间已不属于该结构体,在使用之前需要为之分配空间。




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