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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhudong100 中级黑马   /  2015-10-26 22:52  /  1166 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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)时,会报错,求高人解答。

5 个回复

倒序浏览
这个是一个内存分配的问题。结构体内部元素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;
}
回复 使用道具 举报
liujun_lll 发表于 2015-10-27 16:53
这个是一个内存分配的问题。结构体内部元素char *name为指针,定义结构体变量时,系统会自动分配内存给char ...

明白了,谢谢你!
回复 使用道具 举报
liujun_lll 发表于 2015-10-27 16:53
这个是一个内存分配的问题。结构体内部元素char *name为指针,定义结构体变量时,系统会自动分配内存给char ...

我还是不懂,麻烦大神解释下,为什么后面不分配了,不是数组会自动开辟内存空间吗?
还有为什么总是第三个?按你说的不是该第二个吗?
回复 使用道具 举报
wokua 发表于 2015-10-30 16:40
我还是不懂,麻烦大神解释下,为什么后面不分配了,不是数组会自动开辟内存空间吗?
还有为什么总是第三 ...

结构体中定义成指针确实是个错误,不过你这个问题我也无法解释,同求高人解答!
回复 使用道具 举报
  1. char *name;
复制代码

光创建不初始化,就成了野指针,用它是非法的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马