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

C 如何释放指向整数数组的指针,c,pointers,free,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)); } int(*gameInfo)[2];//[0]#犯规| |[

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

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));
}
int(*gameInfo)[2];//[0]#犯规| |[1]#球员
gameInfo=(int*)malloc(size*sizeof(int*);
对于(int i=0;i
我在第一行声明指针,在第二行初始化它,并在for中将所有值设置为0。它很好用

加载新值并使用它们之后,我希望释放指针。我做了以下工作:

for (int i = 0; i < size; i++) {
    free(gameInfo[i]);
}
free(gameInfo);
for(int i=0;i
我试图先释放数组,然后释放指针。当它第一次尝试执行“free(gameInfo[I])”时,我得到一个“has triggered a breakpoint”

我已经读到数组,因为它没有动态分配的内存,不需要是空闲的,但是如果我删除for并保持
空闲(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]));
这实质上创建了相当于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);

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

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*);
对于(int i=0;i<2;i++){
memset(gameInfo[i],0,2*sizeof(int));
}
免费(gameInfo);

经过一些测试,我更新了它。原因在于memset和malloc不对齐。显然,您应用了2*sizeof(int)内存和memset 2倍于2*sizeof(int),这超出了您应用的8字节范围。应用16字节,在我的系统中修复了这个问题。谢谢@Lundin提醒我这个问题

首先,您为
gameInfo
分配了错误的字节数。然后你忘记了你没有为
gameInfo[i]
分配内存,并尝试
free
无论如何。我还建议你研究一下结构,因为你拥有的是完美的结构数组,而不是数组数组。你能解释一下我在分配内存时做错了什么吗?至于第二点,正如我在最后一段中所说的,如果我删除for(因此不释放数组),它仍然会给出相同的错误。感谢you@MichaWiedenmann:两者都不是,他想要一个成对数字的列表。使用
malloc
和“特殊”或“硬”类型时的一个聪明提示:使用
sizeof
中的解引用变量。就像你的例子一样,
gameInfo=malloc(size*sizeof*gameInfo)
我遇到的问题是因为我的malloc中有一个错误。然而,结构方法是一个很好的想法,我将实现它。主题很小,有相同问题的人可以阅读评论并理解发生了什么,所以我会去把你的答案标记为正确答案。谢谢你的帮助!“这实际上创建了与2D int数组相当的空间”否!它分配两块碎片内存!此外,您不能以这种方式通过调用calloc或memset来初始化数据。请忘记使用这些指针查找表。它们既复杂、缓慢又不安全。struct的想法是正确的,可能是实际问题的正确解决方案,但它不是2D数组。@Lundin-同意。没有争论。我已在我的帖子中澄清了这一说法。谢谢你指出那个错误。但是,我经常使用指向struct的多个实例的指针,并且性能满足我的需要。它们允许读取大量数据集合,需要使用多种数据类型进行表示,其中实例的数量直到运行时才知道。
&gameInfo[0]
->
gameInfo
。但是这里有更严重的问题,比如OP分配一个指针数组而不是数据。@Lundin wat你的意思是分配一个指针数组而不是数据吗。最初的malloc函数分配了一个8字节的字段,并将起始地址发送给gameInfo。如果定义了正确的指针类型,C允许您使用gameInfo[i]访问第n个数据。但是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);