运行程序时核心被丢弃了

时间:2016-05-24 00:07:24

标签: c++ pointers struct

当我尝试运行代码时,它会要求输入第一个输入,但接下来它会显示转储的核心。

我有些疑惑,我怎样才能纠正这些警告?

如果可以优化此代码,请告诉我,我正在尝试制作 高效代码:D

编译:

g ++ -O2 -Wall Proy2.cpp -o Proy2

代码:

#include < cstdio >

#include < iostream >

using namespace std;

int main(){

    typedef struct PC{

    char Brand[20];
    char Model[20];
    char Serial[20];
    char Processor[10];

    };

    PC PC1[5],*machine;

    unsigned int i;

    for(i = 0; i < 4; i++){

    cout <<"Insert PC brand: ";
        fgets(machine->Brand, 20, stdin); fflush(stdin);

    cout <<"Insert PC model: ";
        fgets(machine->Model, 20, stdin); fflush(stdin);

    cout <<"Insert PC serial: ";
        fgets(machine->Serial, 20, stdin); fflush(stdin);

    cout <<"Insert PC processor: ";
        fgets(machine->Processor, 10, stdin); fflush(stdin);

    printf("PC Brand : %s", PC1[i].Brand);
    printf("PC Model : %s", PC1[i].Model);
    printf("PC Serial : %s", PC1[i].Serial);
    printf("PC Processor: %s", PC1[i].Processor);

    PC1[i] = *machine;

    }

    return 0;
}

3 个答案:

答案 0 :(得分:1)

cout是C ++,printf是C. fgets也是C,应该是getline(C ++)。你必须选择语言,而不是两者兼而有之。 Char*是C,string是C ++

您的课程或结构不应该在您的主要

#include <cstdio>

#include <iostream>

using namespace std;

typedef struct PC{

    string Brand;
    string Model;
    string Serial;
    string Processor;

};

int main(){

    PC *PC1[5]; // pointer of pointers
    PC *machine=new PC[4];

    unsigned int i;

    for(i = 0; i < 4; i++){

        cout <<"Insert PC brand: ";
        cin >> machine->Brand;

        cout <<"Insert PC model: ";
        cin >> machine->Model;

        cout <<"Insert PC serial: ";
        cin >> machine->Serial;

        cout <<"Insert PC processor: ";
        cin >> machine->Processor;

        PC1[i] = machine; // you store the machine in PC1

        cout << "PC Brand : " << PC1[i]->Brand << endl;
        cout << "PC Model : " <<PC1[i]->Model << endl;
        cout << "PC Serial : " <<PC1[i]->Serial << endl;
        cout << "PC Processor: " <<PC1[i]->Processor << endl;

    }

    return 0;
}

您使用PC1[5]并且在循环中您只提供4个元素(0到3是4个元素)。我想改变你的循环

答案 1 :(得分:1)

您定义了两个变量

PC PC1 [5],*机器;

意味着

PC1是大小为5的数组,每个元素都是PC(每个元素都已经用默认的ctor初始化)

机器是ptr到PC,未初始化而未分配

然后你在机器上存储

fgets(machine-&gt; Brand,20,stdin)

并在机器未初始化时获取核心转储

可能你现在正在猜测解决方案 这是初始化机器

在分配任何内容之前,如下面的内部循环

machine =&amp; PC1 [i];

顺便说一句,在定义struct / class时,C ++中不需要typedef,因为它是自动类型化的

答案 2 :(得分:0)

在这里打印未初始化的变量:

printf("PC Brand : %s", PC1[i].Brand);

以及以下几行。您从未将任何数据写入PC1[i]。相反,您将数据写入您new并且指向machine的对象中。

稍后您就行:

PC1[i] = *machine;

我猜你的意思是该行在printf行之前。

请注意,无需使用动态分配。您可以改为编写PC machine;。事实上,您可以直接阅读PC1[i],甚至根本没有machine