将内存释放到C中的2d数组

时间:2018-02-10 23:14:55

标签: c arrays memory malloc 2d

所以我使用以下逻辑创建了一个动态大小的2d数组:

int **newBoard;
newBoard = (int **) malloc(sizeof(int *) * rows);
newBoard[0] = (int *) malloc(sizeof(int) * cols * rows);

for (i = 0; i < rows; i++) {
    newBoard[i] = (*newBoard + cols * i);
}

但现在我无法释放我分配的内存。每当我尝试收到“free():无效指针:0x00000000007343c8 ***”错误消息。我目前正试图释放内存,如:

for (i = 0; i < rows; i++) {
    free(newBoard[i]);
}
free(newBoard);

任何人都可以帮助我并告诉我如何正确地解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

当你这样做时

newBoard[0] = (int *) malloc(sizeof(int) * cols * rows);

您正在为cols * rowsint个空间分配一个连续的内存块。 您只能使用块的开头释放一次,无法释放它 内存开始的偏移量,你不能多次释放它,只能 一旦

for (i = 0; i < rows; i++) {
    newBoard[i] = (*newBoard + cols * i);
}

这里newBoard[i]正在获取继续内存块的偏移量, 所以你不能在不同的偏移量下不止一次,你必须释放它 在阻止开始时一次

free(newBoard[0]);
free(newBoard);

是正确的。

请不要cast malloc,这是不好的做法。你应该检查一下 malloc会返回NULL

我个人认为这是一种聪明的方式,只能做2 malloc而不是row+1 malloc newBoard[i],但它也有缺点。你必须非常小心。释放单块内存 不需要是不可能的,单free的重新分配也不是 可能。你必须有很多纪律才能避免错误 多个for(i = 0; i < rows; ++i) newBoard[i] = malloc(cols * sizeof *newBoard[i]); ,这就是我认为传统做法的原因 整体更好。我会这样做:

let shop = Map({
  shopInput: '',
  shopShouldHideResults: true,
  place: null,
  position: {},
  shopAutocompleteResults: {
    predictions: [{ description: '' }]
  }
})

let product = Map({
  brand: '',
  name: '',
  description: '',
  image: null,
  price: null,
  id: null,
  item: 'MEAL'
})

export const addPage: Map<*, *> = Map({
  shop: shop,
  product: product,  
  shopListDisplayed: false,
  rerenderKey: false
})
然后你可以像你一样自由。