如何释放指向整数数组的指针

How to free pointer to an array of integers

我在弄清楚如何释放指向整数数组的指针时遇到问题,我的代码如下:

int (*gameInfo)[2]; // [0] # of fouls || [1] # of players
gameInfo = (int *)malloc(size * sizeof(int*));
for (int i = 0; i < size; i++) {
    memset(gameInfo[i], 0, 2 * sizeof(int));
}

我在第一行声明指针,在第二行初始化它,并在 for 中将所有值设置为 0。它工作正常。

加载新值并使用它们后,我想释放指针。我执行以下操作:

for (int i = 0; i < size; i++) {
    free(gameInfo[i]);
}
free(gameInfo);

我试图先释放数组,然后再释放指针。我第一次尝试执行 "free(gameInfo[i])" 时得到 "has triggered a breakpoint"。

我读过该数组,因为它没有动态分配的内存,所以不需要空闲,但是如果我删除 for 并只保留 free(gameInfo);,它会给出相同的错误. 我在某个博客上读到过这个,所以我不确定它是否值得信赖。

谢谢!

首先,为了您陈述的目的,声明:

int (*gameInfo)[2]; // [0] # of fouls || [1] # of players

可能是:

int *gameInfo[2]; // [0] # of fouls || [1] # of players

然后,数组的两个元素的分配如下所示:

int size = 10; // for example

gameInfo[0] = malloc(size * sizeof(*gameInfo[0]));
gameInfo[1] = malloc(size * sizeof(*gameInfo[1]));

这实际上创建了一个 数量的 space 等同于您使用 2D int 数组的数量,例如:

int gameInfo[2][10];

使用后,释放它们:

free(gameInfo[0]);
free(gameInfo[1]);

更好的选择,如评论中所述,可能是创建一个结构:

typedef struct {
   int fouls;
   int players;
} GAME;

然后使用可以包括创建、使用然后释放一系列游戏:

GAME *game;
game = calloc(10, sizeof(*game));
...
game[0].fouls = 3;
game[0].players = 2;
...
game[9].fouls = 6;
game[9].players = 3;
...
free(game);

首先,您分配不正确。您正在使用一个数组指针,所以它应该被设置为指向一个数组,而不是一些零散的指针查找 table.

int (*gameInfo)[players]; // [0] # of fouls || [1] # of players
gameInfo = calloc(1, sizeof( int[fouls][players] ));

...
gameInfo[x][y] = something;
...

free(gameInfo);

就是这样。

这不仅提高了代码的可读性,还极大地提高了性能。

进一步研究:.

int(*gameInfo)[2];
gameInfo = (int*)malloc(4 * sizeof(int*));
for (int i = 0; i < 2; i++) {
    memset(gameInfo[i], 0, 2 * sizeof(int));
}
free(gameInfo);

经过一些测试,我更新了它。原因在于memset和malloc没有对齐。很明显你申请了2*sizeof(int)内存和memset 2次2*sizeof(int),超出了你申请的8字节范围。应用 16 字节,在我的系统中解决了这个问题。感谢@Lundin 提醒我这个问题。