c语言字符串指针为什么不能用scanf赋值

来源:百度知道 编辑:UC知道 时间:2024/07/02 23:46:09
程序段如下:

#include"stdio.h"
main()
{struct st {
int nu ;
char *name ;
}a[3];
int i ;
for(i=0;i<3;i++)
scanf("%d%s",&a[i].nu,a[i].name);
for(i=0;i<3;i++)
printf("%3d% s\n",a[i].nu,a[i].name);
}

怎么就错了呢,为什么不能用scanf函数对字符串指针赋值呢?
或怎么修改?(能不能保留scanf 函数对字符串指针赋值的形式)

C语言是比较低级的语言,没有字符串概念,只有字符数组,不能自动分配空间,要存放数据,必须预先定义存储空间的大小!
改为:char name[100]; 一定要常量
scanf("%d%s",&a[i].nu,a[i].name); 就没问题了!

估计你曾经看过这种定义法:char *name="abcd";这种也是字符数组初始化固定的空间4个,所以你要记住,初始化一定要预定存放的空间大小!

还有你想达到高级语言的效果,你也可以用
a[i].name = (char *)malloc(100); /*这里也要常量*/
scanf("%d%s",&a[i].nu,a[i].name); 就没问题了!

这里:struct st {
int nu ;
char name[100] ;//需要初始化长度
}a[3];
char *name;语句会定义一个指针,该指针未被初始化,是个无效的地址,会引起非法访问。