如何释放指向整数数组的指针
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 提醒我这个问题。
我在弄清楚如何释放指向整数数组的指针时遇到问题,我的代码如下:
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 提醒我这个问题。