多维数组的一部分在分配给不同部分后无法访问

问题描述 投票:0回答:1

我有一个 3 维数组。 int maxStrLen、int numberColumns、int numberRows 都设置为大数字,这不可能导致输入越界

  char*** KanMingBan = malloc(sizeof(char **)); 
  for(int i = 0; i < numberColumns; i++) {
    KanMingBan[i] =  malloc(sizeof(char*));  
    for(int j = 0; j < numberRows; j++) {
    KanMingBan[i][j] = malloc(maxStrLen * sizeof(char));
    }
  }

我有一个复制字符串函数,可以逐字节复制

void copystr(char* pointer, struct kmb kmb1, int length, int i, int j) {
      for (int k = 0; k < length; ++k) {
        kmb1.KanMingBan[i][j][k] = pointer[k+1];
      }


}

在调试器中...一旦 KanMingBan[0][0][2] 设置为某个值。 kmb1.KanMingBan[0][4][0] 变得不可访问。怎么了? (后来出现段错误,因为我试图分配 anMingBan[0][4][0] 但我意识到这是内存无法访问的地方)

10              kmb1.KanMingBan[i][j][k] = pointer[k+1];
(gdb) print kmb1.KanMingBan[0][4][0]
$5 = 0 '\000'
(gdb) print k
$6 = 2
(gdb) n
9             for (int k = 0; k < length; ++k) {
(gdb) print kmb1.KanMingBan[0][4][0]
Cannot access memory at address 0x555555646f54
(gdb) 
11

起初我使用了 strcpy 但后来我想因为 malloc 是不连续的我只是逐字节复制。事实证明它没有帮助......并且字节的设置作为 3d 数组中的某些空间会影响数组中的另一个空间......我已经检查了这两个位置是否连续......它们不是......所以我真的不知道发生了什么

arrays c pointers memory-management
1个回答
0
投票

事实证明这有效

char ***KanMingBan = malloc(numberColumns * sizeof(char **));  
for (int i = 0; i < numberColumns; i++) {
    KanMingBan[i] = malloc(numberRows * sizeof(char *));
    for (int j = 0; j < numberRows; j++) {
        KanMingBan[i][j] = malloc(maxStrLen * sizeof(char));
    }
}

当你 malloc 每个元素时?我不知道为什么这有效

© www.soinside.com 2019 - 2024. All rights reserved.