我目前正在编写一个旨在使用指针和结构更新学生数据的程序,但是出现了段错误(核心转储)错误。这是我使用的代码:
#include <iostream>
using namespace std;
struct Person
{
char name[64];
int age;
char gender[12];
};
int main()
{
int loop;
cout << "how many student to input: ";
cin >> loop;
struct Person *ptr[loop], d[loop];
for(int c = 1; c < loop; c++){
Person *ptr[c], d[c];
ptr[c] = &d[c];
}
for (int a = 1; a <= loop; a++){
cout << "Name: ";
cin >> (*ptr[a]).name;
cout << "Age: " ;
cin >> (*ptr[a]).age;
cout << "Gender: ";
cin >> (*ptr[a]).gender;
}
cout << "\nDisplaying Information." << endl;
for (int a = 1; a <= loop; a++){
cout << "Name: " << (*ptr[a]).name << endl;
cout <<"Age: " << (*ptr[a]).age << endl;
cout << "Gender: " << (*ptr[a]).gender<<endl;
}
system("pause");
return 0;
}
答案 0 :(得分:1)
我更喜欢将指针初始化为
Person *p = new Person()
相对
*p = &d // assigning the address
还要在第一个for循环中说Person *ptr[c], d[c];
,每次都用不同的大小重新初始化数组。您不必像之前声明它们那样去做,最后C ++中的数组索引从0到n-1开始,其中n是数组的长度。
进行这些更改后,您的主体将看起来像
int main()
{
int loop;
cout << "how many student to input: ";
cin >> loop;
struct Person *ptr[loop], d[loop];
for (int c = 0; c < loop; c++) {
ptr[c] = &d[c];
}
for (int a = 0; a < loop; a++) {
cout << "Name: ";
cin >> (*ptr[a]).name;
cout << "Age: ";
cin >> (*ptr[a]).age;
cout << "Gender: ";
cin >> (*ptr[a]).gender;
}
cout << "\nDisplaying Information." << endl;
for (int a = 0; a < loop; a++) {
cout << "Name: " << (*ptr[a]).name << endl;
cout << "Age: " << (*ptr[a]).age << endl;
cout << "Gender: " << (*ptr[a]).gender << endl;
}
system("pause");
return 0;
}
答案 1 :(得分:0)
为什么要在第一个Person *ptr[c], d[c];
循环中进行for
?在循环内声明的变量的范围仅限于该循环。而且,这些变量将隐藏在循环外部声明的具有相同名称的其他变量。
因此,在您的情况下,循环内的语句ptr[c] = &d[c];
分配给ptr
,这对他的循环来说是 local ,并且无法从循环外的任何位置进行访问。
稍后,当您尝试使用cin >> (*ptr[a]).name;
写入数据时,由于ptr
变量从未被初始化,因此会导致UB。
只需在Person *ptr[c], d[c];
循环中注释掉for
,一切就可以正常进行。
答案 2 :(得分:0)
只需从for循环中删除以下行,代码就可以正常工作:
Person *ptr[c], d[c];
在for循环中声明这些变量将创建新变量,其作用域仅限于for循环。因此,当您执行以下语句时:
ptr[c] = &d[c];
在for循环内,它实际上是在循环内声明的指针'ptr'初始化,而不是在循环外声明的指针。因此,最终在for循环外声明的指针'ptr'不会被初始化,从而导致代码崩溃。