黑马程序员技术交流社区

标题: 结构体数组的初始化 [打印本页]

作者: zhudong100    时间: 2015-10-26 22:52
标题: 结构体数组的初始化
  1. #include <stdio.h>
  2. #define CAP 5
  3. //制作实现简单通讯录
  4. int main(int argc, const char * argv[]) {
  5.     struct personTel{
  6.         char *name;
  7.         char telNum[12];
  8.     } persons[CAP];
  9.     printf("输入联系人信息:姓名 年龄\n");
  10.     for (int i = 0; i < CAP; i++) {
  11.         scanf("%s %s",persons[i].name,persons[i].telNum);
  12.     }
  13.     printf("通讯录信息:\n");
  14.     for (int i = 0; i < CAP; i++) {
  15.         printf("姓名%s 号码:%s\n",persons[i].name,persons[i].telNum);
  16.     }
  17.     printf("Hello, World!\n");
  18.     return 0;
  19. }
复制代码

上面的代码运行时,每当输入三个人后(i=2)时,会报错,求高人解答。
作者: liujun_lll    时间: 2015-10-27 16:53
这个是一个内存分配的问题。结构体内部元素char *name为指针,定义结构体变量时,系统会自动分配内存给char *name,但是结构体数组后面的元素就不会分配内存了,persons[2].nam的地址为NULL,访问时肯定会报错的。因此需要在循环中加入分配内存的环节,就不会出错了

#include <stdio.h>
#define CAP 5
//制作实现简单通讯录
int main(int argc, const char * argv[]) {
    struct personTel{
        char *name;
        char telNum[12];
    } persons[CAP];
    printf("输入联系人信息:姓名 年龄\n");
    for (int i = 0; i < CAP; i++) {
        persons.name = (char *)malloc(12);
        scanf("%s %s",persons.name,persons.telNum);
    }
    printf("通讯录信息:\n");
    for (int i = 0; i < CAP; i++) {
        printf("姓名%s 号码:%s\n",persons.name,persons.telNum);
    }
    printf("Hello, World!\n");
    return 0;
}
作者: zhudong100    时间: 2015-10-30 09:21
liujun_lll 发表于 2015-10-27 16:53
这个是一个内存分配的问题。结构体内部元素char *name为指针,定义结构体变量时,系统会自动分配内存给char ...

明白了,谢谢你!
作者: wokua    时间: 2015-10-30 16:40
liujun_lll 发表于 2015-10-27 16:53
这个是一个内存分配的问题。结构体内部元素char *name为指针,定义结构体变量时,系统会自动分配内存给char ...

我还是不懂,麻烦大神解释下,为什么后面不分配了,不是数组会自动开辟内存空间吗?
还有为什么总是第三个?按你说的不是该第二个吗?
作者: zhudong100    时间: 2015-11-1 11:19
wokua 发表于 2015-10-30 16:40
我还是不懂,麻烦大神解释下,为什么后面不分配了,不是数组会自动开辟内存空间吗?
还有为什么总是第三 ...

结构体中定义成指针确实是个错误,不过你这个问题我也无法解释,同求高人解答!
作者: yanggangcl    时间: 2015-11-3 17:59
  1. char *name;
复制代码

光创建不初始化,就成了野指针,用它是非法的




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