C中的2d数组,负指数

0 c arrays free memory-management

我正在编写一个C程序,我需要带有负索引的2D数组(动态分配)或索引不从零开始.因此对于数组[i] [j],行索引i应该采用例如1到3的值,并且列索引j应该采用例如-1到9的值.

为此我创建了以下程序,这里变量columns_start设置为零,所以只是行索引被移位,这非常正常.

但是当我为变量columns_start分配除零以外的其他值时,我得到消息(来自valgrind)命令"free(array [i]);" 是无效的.所以我的问题是:

  1. 为什么释放我之前分配的内存是无效的?
  2. 如何修改我的程序以转换列索引?

谢谢您的帮助.

#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)

eug*_*che 5

移动列索引时,将新值分配给原始列数组: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)

恕我直言,这种数组索引的修改没有任何好处,同时使程序逻辑复杂化并导致错误.尝试在单循环中动态修改索引.