0 c arrays free memory-management
我正在编写一个C程序,我需要带有负索引的2D数组(动态分配)或索引不从零开始.因此对于数组[i] [j],行索引i应该采用例如1到3的值,并且列索引j应该采用例如-1到9的值.
为此我创建了以下程序,这里变量columns_start设置为零,所以只是行索引被移位,这非常正常.
但是当我为变量columns_start分配除零以外的其他值时,我得到消息(来自valgrind)命令"free(array [i]);" 是无效的.所以我的问题是:
谢谢您的帮助.
#include <stdio.h>
#include <stdlib.h>
main()
{
int **array, **array2;
int rows_end, rows_start, columns_end, columns_start, i, j;
rows_start = 1;
rows_end = 3;
columns_start = 0;
columns_end = 9;
array = malloc((rows_end-rows_start+1) * sizeof(int *));
for(i = 0; i <= (rows_end-rows_start); i++) {
array[i] = malloc((columns_end-columns_start+1) * sizeof(int));
}
array2 = array-rows_start; //shifting row-index
for(i = rows_start; i <= rows_end; i++) {
array2[i] = array[i-rows_start]-columns_start; //shifting column-index
}
for(i = rows_start; i <= rows_end; i++) {
for(j = columns_start; j <= columns_end; j++) {
array2[i][j] = i+j; //writing stuff into array
printf("%i %i %d\n",i, j, array2[i][j]);
}
}
for(i = 0; i <= (rows_end-rows_start); i++) {
free(array[i]);
}
free(array);
}
Run Code Online (Sandbox Code Playgroud)
移动列索引时,将新值分配给原始列数组:in
array2[i] = array[i-rows_start]-columns_start;
Run Code Online (Sandbox Code Playgroud)
array2 [i]和array [i = rows_start]是与array2用array-rows_start初始化相同的内存单元.
因此,内存的释放需要反向移位.请尝试以下方法:
free(array[i] + columns_start);
Run Code Online (Sandbox Code Playgroud)
恕我直言,这种数组索引的修改没有任何好处,同时使程序逻辑复杂化并导致错误.尝试在单循环中动态修改索引.