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

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 回答
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 回答