所以我使用以下逻辑创建了一个动态大小的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);
任何人都可以帮助我并告诉我如何正确地解决这个问题吗?
答案 0 :(得分:2)
当你这样做时
newBoard[0] = (int *) malloc(sizeof(int) * cols * rows);
您正在为cols * rows
个int
个空间分配一个连续的内存块。
您只能使用块的开头释放一次,无法释放它
内存开始的偏移量,你不能多次释放它,只能
一旦强>
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
})
然后你可以像你一样自由。