2

私はこのような基本的な構造を持っています

typedef struct struck {
    char* id;
    char* mat;
    int value;
    char* place;
} *Truck;

そして、その構造体の新しい「インスタンス」を作成するこのような関数:

Truck CTruck(char* id, char* mat, int value, char* place) {
    Truck nT = (Truck) malloc(sizeof (Truck));
    nT->value = value;
    strcpy(nT->id, id);
    strcpy(nT->mat, mat);
    strcpy(nT->place, place);
    return nT;
}

最初にエラーが発生しますstrcpy。問題なくコンパイルされます。

4

3 に答える 3

11

typedef は、つまりポインターTruckとして定義します。そのため、構造体のサイズではなく、アーキテクチャに応じてstruct struck *サイズが異なり4ます8

sizeof(*Truck)構造体の実際のサイズを取得するために使用します。

また、文字にメモリを割り当てる必要があります。最も簡単な方法は、を使用することstrdup()です。

Truck CTruck(const char* id, const char* mat, int value, const char* place) {
    Truck nT = malloc(sizeof (*Truck));
    nT->value = value;
    nT->id = strdup(id);
    nT->mat = strdup(mat);
    nT->place = strdup(place);
    return nT;
}

ただし、 typedef を変更して、構造体へのポインターではなく、構造体のエイリアスにすることをお勧めします。

typedef struct {
    char* id;
    char* mat;
    int value;
    char* place;
} Truck;

あなたの関数では、これを使用します:

Truck *nT = malloc(sizeof(Truck));
于 2012-04-13T15:16:59.920 に答える
7

nT->id単なるポインタです。malloc文字列をコピーするにはメモリが必要です。他の人も同じです。

于 2012-04-13T15:16:53.963 に答える
4

の使い方sizeofが間違っています。一般に、への引数はmalloc()「返されたポインタが指しているサイズ」である必要があります。つまり、必要ですsizeof *nT。また、型名の繰り返しをなくす方法もわかります ( Truck)?

また、C では;の戻り値をキャストする必要はありません。malloc()それは何の役にも立たず、実際のエラーを隠し、コードを読みにくくします。

他の人が指摘しているように、文字列データにもスペースを割り当てていません。構造内のポインターだけです。

于 2012-04-13T15:19:00.007 に答える