黑马程序员技术交流社区

标题: 在结构体中“char*name “和 ”char name[21]”有什么区别??? [打印本页]

作者: 紫荆秋雪    时间: 2015-7-21 21:03
标题: 在结构体中“char*name “和 ”char name[21]”有什么区别???
例题要求:让用户从键盘输入要保存的姓名和电话号码
下面的代码是我写的,在运行的时候当我输入第一个人的姓名、电话号码后回车就好报错?这是为什么?
当我把
char*name 改为 char name[21]
char *num 改为 char  num[12]
运行就OK了,这两种定义有什么区别?
#include <stdio.h>
int main()
{
    //定义变量
    int i;
    //先定义一个结构体并且定义一个结构数组
    struct  TXL
    {
        char *name;
        char *num;
    }txl[2];

    //从键盘输入通讯录中联系人的姓名、电话号码

    //请输入联系人的姓名
    printf("请输入联系人的姓名和电话号码格式为:姓名  电话号码\n");
    for(i=0;i<2;i++)
    {
        scanf("%s %s",txl.name,txl.num);
    }

    //遍历通讯录
    printf("打印出通讯录中的内容\n");
    for(i=0;i<2;i++)
    {
        printf("姓名:%s\n电话号码:%s\n",txl.name,txl.num);
        printf("\n");
    }

}

作者: liusuizuoyou    时间: 2015-7-24 10:21
报错的原因  是输入方法的问题    因为你的回车被下一次循环的sanf吸收了
作者: 丁铭检    时间: 2015-7-24 21:48
本帖最后由 丁铭检 于 2015-7-24 22:21 编辑

这个是字符串指针问题,其区别老师在视屏中有讲到。。char *name  你定义的指针字符没有初始化,就是没有给其一个明确的指向,你这样直接的利用会有问题。所以个人建议结构体中的变量尽量不要出现指针类型变量。
作者: 丁铭检    时间: 2015-7-24 21:49
liusuizuoyou 发表于 2015-7-24 10:21
报错的原因  是输入方法的问题    因为你的回车被下一次循环的sanf吸收了

你这个。。还是先仔细看看基础视屏吧。。。
作者: 小林儿    时间: 2015-7-24 22:20
谢谢大神很受用哦~
作者: 紫荆秋雪    时间: 2015-7-25 12:54
丁铭检 发表于 2015-7-24 21:48
这个是字符串指针问题,其区别老师在视屏中有讲到。。char *name  你定义的指针字符没有初始化,就是没有给 ...

谢谢,如何不是从键盘输入,而是程序中赋值:定义为字符串指针应该是比定义为数组方便(个人认为)
因为,在初始化的时候 比如:
char *name     name="姓名"

char  name[]   strcpy(name,"姓名");
需要用函数来赋值
作者: 大湿    时间: 2015-7-25 13:08
因为char *name; 他只是一个指针变量,他是一个野指针,需要给分配空间,比如 char *name = (char *)malloc(100);你可以再使用name试试
作者: 丁铭检    时间: 2015-7-25 13:39
紫荆秋雪 发表于 2015-7-25 12:54
谢谢,如何不是从键盘输入,而是程序中赋值:定义为字符串指针应该是比定义为数组方便(个人认为)
因为 ...

定义字符数组不是一样可以直接 char name[] = "姓名";
作者: 408205555    时间: 2015-7-25 19:15
上面回答的都很详细
作者: 紫荆秋雪    时间: 2015-7-26 11:32
丁铭检 发表于 2015-7-25 13:39
定义字符数组不是一样可以直接 char name[] = "姓名";

定义数组直接初始化是可以的但是,后初始化这就 不能了
作者: wowthe1st    时间: 2015-7-26 14:37
指针变量跟数组的区别在于,指针变量声明后就分配了存放一个地址的内存空间,数组声明后分配了存放整个数组的内存空间,sanf函数需要将输入的值存放在内存中指定的位置,而这个位置必须是正常可用的,指针变量仅仅是分配了一个空间,却并没有指定这个空间存放的地址值是多少,则他的实际值是不确定的,导致程序可能修改未知的内存数据,导致问题,运行时就不允许这类操作,报错
作者: CesC    时间: 2015-7-26 14:56
你好学霸!!!
作者: xiaochongzi    时间: 2015-7-26 17:01
同学,指针变量是需要进行初始化的,不然是野指针
作者: 紫荆秋雪    时间: 2015-7-27 10:06
xiaochongzi 发表于 2015-7-26 17:01
同学,指针变量是需要进行初始化的,不然是野指针

谢谢,刚试了一下初始化,也不行会报错,我用的是VC++6.0不清楚是不是因为环境的关系?
作者: kk要来黑马    时间: 2015-7-27 13:46
你的C语言不过关啊,
作者: DUKEMAN    时间: 2015-8-4 23:01
用了楼主的说法 换个数组类型 结果报错为 TXL[2]不是结构体

屏幕快照 2015-08-04 10.57.42 PM.png (144.19 KB, 下载次数: 299)

屏幕快照 2015-08-04 10.57.42 PM.png

作者: 刘唐飞    时间: 2015-8-5 00:58
哇撒 真的从上看到尾 都很专业啊 真想赶快进入黑马 与大家一起学习啊
作者: 紫荆秋雪    时间: 2015-8-5 11:44
wowthe1st 发表于 2015-7-26 14:37
指针变量跟数组的区别在于,指针变量声明后就分配了存放一个地址的内存空间,数组声明后分配了存放整个数组 ...

谢谢大神!




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