0

これが私のコードです:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>


using namespace std;

struct Computer
{
    char * model;
    char * assembler;
    int processorInt;
};

int main()
{
    Computer comp;
    char* model;
    char* assembler;
    int processorInt;

    cin>>model;
    cin>>assembler;
    cin>>processor int;

    comp.model = model;
    comp.assembler = assembler;
    comp.processorInt = processorInt;

    return 0;
}

//そうすると動作しますが、別の方法で行うとセグメンテーション違反が発生します

#include <iostream>
#include <stdio.h>
#include <stdlib.h>


using namespace std;

struct Computer
{
    char * model;
    char * assembler;
    int processorInt;
};

void setValues()
{
    Computer comp;
    char* model;
    char* assembler;
    int processorInt;

    cin>>model;
    cin>>assembler;
    cin>>processor int;

    comp.model = model;
    comp.assembler = assembler;
    comp.processorInt = processorInt;
}

int main()
{
    setValues();

    return 0;
}

では、その理由は何ですか?

私の目標は、各「コンピューター」に関する情報を保存できる構造の配列を作成し、任意の構造を編集して、配列全体をprocesorIntでソートできるようにすることです。しかし、通常の編集可能な構造を作成することさえできません。

4

2 に答える 2

5

charどこも指していないポインタを読んでいます。読み取った文字を格納するスペースがありません。

std::string入力からの古い文字を保持するために自動的にサイズが変更されるため、を使用する方がはるかに簡単です。

Computer comp;
std::string model;
std::string assembler;
int processorInt;

cin>>model;
cin>>assembler;
cin>>processorInt;
于 2012-09-06T20:19:49.210 に答える
2

どちらのバージョンも機能しません。初期化されていないポインターにデータを読み込もうとしています。eg を宣言するだけchar* model;では、初期化されていないポインターが残ります。これは、メモリ内の任意の場所を指すことができます。を使用してその場所に文字列を保存しようとすると、自分のcin >>ものではないメモリを書き込むことになります。これはセグメンテーション違反であるか、動作しているように見える場合があります。

宣言するだけchar*では、文字列用のスペースが得られません。標準の C 文字列を使用している場合は、データを与える必要があります。charポインタを固定サイズの配列にするかmalloc、文字列バッファを割り当てるために使用します。

char model[MAX_STRING_LENGTH];

freeまたは malloc を使用しますが、後でこのメモリが必要になることに注意してください。

char *model = malloc(MAX_STRING_LENGTH);

標準の C 文字列とcin一緒に使用する場合は、まったく使用>>しないでください。入力サイズを制限する方法はありません。代わりにcin.getlinewithMAX_STRING_LENGTHを制限として使用します (詳細については、ドキュメントの例を参照してください)。

ただし、std::string代わりに使用することをお勧めします。そうすると、文字列用のスペースを自分で提供する必要がなくなり、コードを大幅に変更する必要がなくなります。

于 2012-09-06T20:20:53.147 に答える