最近发现一个特有意思的警告,比如下面的二维数组:
#include <stdlib.h>
int main() {
int row = 10; // 行数
int col = 20; // 列数
int** array; // 声明一个指向数组的指针,数组有col列
array = malloc(row * sizeof(int*)); // 使用malloc分配内存
if (array == NULL) {
// 内存分配失败的处理
exit(EXIT_FAILURE);
}
// 使用array作为二维数组进行操作
for (int i = 0; i < row; i++) {
array[i] = malloc(col * sizeof(int));
if (array[i] == NULL) {
exit(EXIT_FAILURE);
}
}
// 释放内存
for (int i = 0; i < row; i++) {
if(array[i]) free(array[i]);
}
free(array);
return 0;
}
上面的代码,我们经常会在
if(array[i]) free(array[i]);
提示C6001警告,其实这里面的提示是因为array的指针地址等于array[0]的指针地址(即array = array[0]),如果先释放array[0]有可能会使得array[1]及以后的地址丢失,所以发出了警告!
解决方案:
释放顺序改变一下即可!!如下:
// 释放内存
for (int i = row-1; i >= 0; i--) {
if(array[i]) free(array[i]);
}
稍微变一下就可以解决C6001警告!