我在弄清楚如何释放指向整数数组的指针时遇到了问题,我的代码如下:
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);
它会给出相同的错误。
我在某个博客上看过这个,所以我不确定它是否值得信赖。
谢谢!
答案 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);
就是这样。
这不仅使代码更具可读性,而且还大大提高了性能。
答案 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提醒我这个问题。