首页 新闻 会员 周边 捐助

C语言程序,不知哪里有问题

0
悬赏园豆:5 [已解决问题] 解决于 2012-09-19 21:45

求教,不知这个结构体程序哪里出了问题,求指教!

#include<stdio.h>
struct student
{
    char *name;
    int age;
    float grade;
    char *adress;
};
int main()
{
    int i,j;
    struct student a[5];
    for(i=0;i<2;i++)
        scanf("%s%d%f%s",&a[i].name,&a[i].age,&a[i].grade,&a[i].adress);
    for(j=0;j<5;j++)
        printf("%s%d%f%s\n",a[j].name,a[j].age,a[j].grade,a[j].adress);
}
爱在彼岸的主页 爱在彼岸 | 初学一级 | 园豆:198
提问于:2012-09-18 00:58
< >
分享
最佳答案
1

问题很多啊。name和address两个都是指针,你写student a[5]的时候,每个元素里的指针都是“野指针”,当然要出问题了。

可以把指针char* name 改成结构体内的数组 char name[32]; 这样这可以了。

或者在scanf之前,写 a[i].name = new char[32]; 或 a[i] .name = (char*)malloc(32);等均可。

收获园豆:3
hoodlum1980 | 小虾三级 |园豆:573 | 2012-09-18 03:19

用char指针类型数据,就可以把name当做是字符串,可以不用指定数组长度,这样就可以有效减少内存的浪费呀……您说的野指针,那要是我在开始就让其指定一个特定的数,不知道可否?

爱在彼岸 | 园豆:198 (初学一级) | 2012-09-18 21:53

@爱在彼岸: 也可以啊。不过你所说的特定的数必须是有效的可读写内存地址,不然当然还是会出问题。要给它设定分配好的内存地址,不然当然会出问题。

比如

char* pBuf = (char*)malloc(sizeof(32 * sizeof(char));

pBuf[0] = 0;

a[0].name = pBuf;

然后就可以继续对a[0].name进行操作了。

但是a[0].name = "..."; 这样就只能a[0].name读,而不能改写a[0].name;

hoodlum1980 | 园豆:573 (小虾三级) | 2012-09-18 21:57
其他回答(1)
1

struct student
{
   
char name[32];
   
int age;
   
float grade;
   
char adress[256];
};

收获园豆:2
Launcher | 园豆:45050 (高人七级) | 2012-09-18 09:23

用char指针类型数据,就可以把name当做是字符串,可以不用指定数组长度,这样就可以有效减少内存的浪费呀……按照楼上的说法是因为存在野指针,那要是我在开始就让其指定一个特定的数,不知道可否?不知可否用类似方式来定义字符串?

支持(0) 反对(0) 爱在彼岸 | 园豆:198 (初学一级) | 2012-09-18 21:54

@爱在彼岸: 

“用char指针类型数据,就可以把name当做是字符串”

这是错误的

字符串是指一个字符序列(包括结尾的null character)

字符串有时可以视为char *类型(但不是所有情况下都这样)

也经常通过char *类型指针操作

但不能说可以把char *类型指针视为字符串

你打算输入字符串

就必须为字符串预备存储空间

支持(1) 反对(0) garbageMan | 园豆:313 (菜鸟二级) | 2012-09-18 22:23

@爱在彼岸: 

char* pName = (char*)malloc(sizeof(32 * sizeof(char));

char name[32];

void Func(const char * p)

{
}

Func(pName) 和 Func(name) 是等价的。

我同意你关于可以减少内存浪费的观点,但是,就个人的经验来看,如果你确实要这样做,那么你需要编写一个类,用以封装字符串对象,类似MFC/ATL的CString,std::string。否则,你将面临动态分配内存后的传值和内存回收的巨大难题。

支持(1) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-09-19 09:23

@Launcher: 你的回答让我很是受教,非常感谢。但是还是要给你说一个很抱歉的事情,由于只能选一个的答案为最终答案,上面的那位说的也很好所以……看你是专家级别的,因该不会很在意这个了……真的非常对不起,你的回答真的很令人满意!

支持(0) 反对(0) 爱在彼岸 | 园豆:198 (初学一级) | 2012-09-19 21:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册