C语言 为定义类型的指针分配内存



我隐藏了一个指针与类型的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]) );代替。

最新更新