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

时间:2018-04-25 12:10:58

标签: c pointers free

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

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])”时,我得到了“触发断点”。

我已经读过数组,因为它没有动态分配的内存,不需要是免费的,但是如果我删除for并且只是离开free(gameInfo);它会给出相同的错误。 我在某个博客上看过这个,所以我不确定它是否值得信赖。

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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]));

这实际上创建了一个数量的空间,等同于你对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);

答案 1 :(得分:0)

首先,您分配不正确。您正在使用数组指针,因此应将其设置为指向数组,而不是指向某个碎片指针查找表。

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

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

free(gameInfo);

就是这样。

这不仅使代码更具可读性,而且还大大提高了性能。

进一步研究:Correctly allocating multi-dimensional arrays

答案 2 :(得分:0)

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提醒我这个问题。