我的指针代码c ++中的分段错误(核心已转储)

时间:2019-01-16 04:11:06

标签: c++

我目前正在编写一个旨在使用指针和结构更新学生数据的程序,但是出现了段错误(核心转储)错误。这是我使用的代码:

#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;
}

3 个答案:

答案 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'不会被初始化,从而导致代码崩溃。