C语言,字符指针的问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 17:09:14
为什么把char *name 改称char name[20] 就能正常运行了?

#include <stdio.h>
#define NUM_1 2

struct student
{
int id;
char *name;
char text[20];
}stu[NUM_1];

main()
{

int i;

for(i=0;i<NUM_1;i++)
{
scanf("%d %s %s",&stu[i].id,stu[i].name,stu[i].text);
}

for(i=0;i<NUM_1;i++)
{
printf("%d,%s,%s",stu[i].id,stu[i].name,stu[i].text);
}
}

因为char *name没有初始化,所以指针name不知道指向哪块空间。
如果改成char name[20]则name在声明时分配了20个字节的空间,虽然空间的值没有初始化,但是这块空间却是存在的。而第一种情况name只是一个指针,他需要指向一个变量或数组的,你没有给他赋值,他不知道指向哪里,所以你用name[i]他就报错了。
除非你像上面那位老兄说得
stu[i].name = (char *)malloc(strlen(buf)+1);/*分配内存空间*/
或者
stu[i].name = new char[20];/*分配内存空间*/
new是c++的用法。对应的删除内存是delete,和free功能差不多,但不完全一样,这里就不多说了。

指针是空地址,在创建结构变量的时候尽量不要定义指针,用数组比较好。
写指针有的编译器也能过去。

int id;
char *name;
char text[20];
看到这个没?CHAR 定义错了,[]这个我忘了怎么说了,反正就是数组的意思,
for(i=0;i<NUM_1;i++)
{
scanf("%d %s %s",&stu[i].id,stu[i].name,stu[i].text);
上面的意思是FOR循环,把D,,S,S(我不知道这里为什么会有两个S,但就照你那说的)附值给ID,NAME,TEXT,名称不可能只有一个的,NAME的定义和TEXT是一样的,所以要加上[]

应该是指针没有初始化,不过我也不清楚应该在哪里给结构中的指针以内存空间。

#include <stdio.h>
#define NUM_1 2

struct student
{
int id;
char *name;
char text[20];
}stu[NUM_1];

main()
{
char buf[256];
int i;