我隐藏了一个指针与类型的pedef,我试图使它的数组。我的结构是:
typedef struct s {
int y;
int x;
int value;
} s;
typedef s *t;
和主:
int main()
{
t *var;
int arg;
var = malloc(sizeof(t*));
arg = 40;
for (int x = 0; x < arg; x++)
{
var[x] = malloc(sizeof(t));
var[x]->x = -1;
var[x]->y = -1;
var[x]->value = 0;
}
for (int x = 0; x < arg; x++)
{
printf("|%d| ",var[x]->value);
}
return 0;
}
有时它只是分割错误,有时值只是脏,但它仍然意味着它没有按预期分配内存。我错过了什么?我只是想创建一个类型为t的数组其中arg长度必须是一个变量
我隐藏了一个类型为pedef的指针
这个非常糟糕的做法是所有bug的根源。简单的不要在typedef后面隐藏指针
因为现在你有一个t* var
实际上是一个s**
。然后调用var = malloc(sizeof(t*));
,这是完全错误的,因为您为s**
分配了空间。
您应该为40 * sizeof(s*)
分配空间,否则var[x]
将出现故障。
然后是typepedef,这不是一个2D数组,而是一个分段查找表,这增加了额外的复杂性和较慢的代码,绝对没有任何收获。请参阅正确分配多维数组。但它看起来根本不需要二维数组,这是怎么来的?
考虑到所有这些,让我们开始使用KISS原则并从头重写代码:#include <stdio.h>
#include <stdlib.h>
typedef struct {
int y;
int x;
int value;
} s;
int main (void)
{
int arg = 40;
s* var = malloc(arg * sizeof(*var));
for (int i = 0; i < arg; i++)
{
var[i].x = -1;
var[i].y = -1;
var[i].value = 0;
}
for (int i = 0; i < arg; i++)
{
printf("|%d| ",var[i].value);
}
free(var);
return 0;
}
2D版本将使用s (*var)[y] = malloc( sizeof(s[x][y]) );
代替。