2

次のような構造体は問題なく動作します。malloc(sizeof(mystruct))を呼び出した後にtを使用できます。

struct mystruct {
 MyDef *t[5];
};

次のように、 MyDefの配列の長さを動的に設定できるようにしたい:

struct mystruct {
 MyDef **t;
 int size;
};

これを機能させるには、 malloc(sizeof(mystruct))に追加して何をする必要があるので、 TestStruct->t[3] = somethingを実行できますか? セグメンテーション違反が発生しています。

ありがとう!

私が盲目でない限り、セグフォルトを引き起こすコードで編集してください。これはこれまでの答えのようです

#include <stdio.h>
typedef struct mydef {
 int t;
 int y;
 int k;
} MyDef;

typedef struct mystruct {

 MyDef **t;
 int size;

} MyStruct;

int main(){
 MyStruct *m;

 if (m = (MyStruct *)malloc(sizeof(MyStruct)) == NULL)

  return 0;

 m->size = 11; //seg fault

 if (m->t = malloc(m->size * sizeof(*m->t)) == NULL)  

  return 0;

 return 0;
}
4

3 に答える 3

1
struct mystruct *s = malloc(sizeof(*s));
s->size = 5;
s->t = malloc(sizeof(*s->t) * s->size);
于 2010-10-27T11:41:55.183 に答える
0

これは、配列自体にはメモリを割り当てず、この配列へのポインタにのみ割り当てるために発生します。

したがって、最初に mystruct を割り当てる必要があります。

struct_instance = malloc(sizeof(mystruct));

次に、 MyDef へのポインターの配列にメモリを割り当て、構造体でポインターを初期化する必要があります

struct_instance->size = 123;
struct_instance->t = malloc(sizeof(MyDef*) * struct_instance->size);
于 2010-10-27T11:42:52.237 に答える
0

m = (MyStruct*)malloc(sizeof(MyStruct)) == NULL

それは何をしますか。malloc を呼び出し、malloc の戻り値を NULL と比較します。次に、その比較の結果 (ブール値) を m に割り当てます。

これは、'==' が '=' よりも優先順位が高いためです。

あなたが欲しいもの:

if ( (m = (MyStruct *)malloc(sizeof(MyStruct))) == NULL)
...
if ( (m->t = malloc(m->size * sizeof(*m->t))) == NULL) 
于 2010-10-27T11:40:28.037 に答える