求教,不知这个结构体程序哪里出了问题,求指教!
#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); }
问题很多啊。name和address两个都是指针,你写student a[5]的时候,每个元素里的指针都是“野指针”,当然要出问题了。
可以把指针char* name 改成结构体内的数组 char name[32]; 这样这可以了。
或者在scanf之前,写 a[i].name = new char[32]; 或 a[i] .name = (char*)malloc(32);等均可。
用char指针类型数据,就可以把name当做是字符串,可以不用指定数组长度,这样就可以有效减少内存的浪费呀……您说的野指针,那要是我在开始就让其指定一个特定的数,不知道可否?
@爱在彼岸: 也可以啊。不过你所说的特定的数必须是有效的可读写内存地址,不然当然还是会出问题。要给它设定分配好的内存地址,不然当然会出问题。
比如
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;
struct student
{
char name[32];
int age;
float grade;
char adress[256];
};
用char指针类型数据,就可以把name当做是字符串,可以不用指定数组长度,这样就可以有效减少内存的浪费呀……按照楼上的说法是因为存在野指针,那要是我在开始就让其指定一个特定的数,不知道可否?不知可否用类似方式来定义字符串?
@爱在彼岸:
“用char指针类型数据,就可以把name当做是字符串”
这是错误的
字符串是指一个字符序列(包括结尾的null character)
字符串有时可以视为char *类型(但不是所有情况下都这样)
也经常通过char *类型指针操作
但不能说可以把char *类型指针视为字符串
你打算输入字符串
就必须为字符串预备存储空间
@爱在彼岸:
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。否则,你将面临动态分配内存后的传值和内存回收的巨大难题。
@Launcher: 你的回答让我很是受教,非常感谢。但是还是要给你说一个很抱歉的事情,由于只能选一个的答案为最终答案,上面的那位说的也很好所以……看你是专家级别的,因该不会很在意这个了……真的非常对不起,你的回答真的很令人满意!