C 三重指针:无法将字符串复制到位置 triplepointer[x][y] 且 [x] 大于 1

C triple pointers: Unable to copy string into position triplepointer[x][y] with [x] being greater than 1

我第一次尝试三重指针。 This question 是我获得有关如何分配三重指针的信息的地方,这是三重指针的分配方式:

//In this case size will always be 4
int size = countLines(file);
printf("size: %d\n", size);
char*** tripleptr = malloc(sizeof(*tripleptr)*size);
int i = 0, k = 0, j = 0;
for(; i < size; i++){
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size);
    for(; k< size; k++){
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512);
    }
}

如果我尝试像这样将字符串文字复制到位置 [0][0]

strcpy(tripleptr[0][0], "something");

它工作得很好([0][1] 到 [0][3] 也是一样),但是

strcpy(tripleptr[1][0], "something");

不会(它使程序进入分段错误)。 是什么导致了这种奇怪的行为? 我在内存分配部分找不到任何索引错误

问题出在你的循环中:

int i = 0, k = 0, j = 0;
for(; i < size; i++){
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size);
    for(; k< size; k++){
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512);
    }
}

您在进入嵌套循环之前初始化了 ik,但是当内循环在下一次迭代中重新启动时您没有重置 k。这意味着您只为第一行字符串分配了内存。所以 tripleptr[1][0] 是未初始化的,取消引用该指针会给你 undefined behavior.

每次显式初始化youf循环控制变量:

int i, k;
for(i=0; i < size; i++){
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size);
    for(k=0; k< size; k++){
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512);
    }
}

以下建议代码:

  1. 说明代码块应该如何完成
  2. 表示实际分配了多少内存
  3. 提醒您代码需要检查错误
  4. 表示如果发生错误如何处理

现在,建议的代码:

//In this case size will always be 4
int size = countLines(file);
printf("size: %d\n", size);

char*** tripleptr = malloc(sizeof(*tripleptr)*size);

for(int i = 0; i < size; i++)
{
    tripleptr[i] = malloc(sizeof(*(tripleptr[i]))*size); // is 16 bytes each iteration, assuming a pointer is 4 bytes

    for(int k = 0; k< size; k++)
    {
        tripleptr[i][k] = malloc(sizeof(*(tripleptr[i][k]))*512); // is 4k bytes each iteration
    }
}

注意:为了健壮性:

调用任何堆分配函数时:malloc()realloc()calloc():始终检查 (!=NULL) 返回值以确保操作成功。

如果不成功,请调用 perror( "my error message" );,因为它将输出到 stderr,您的错误消息和系统认为发生错误的文本原因。并记得在退出

之前将每个成功分配的堆内存指针传递给free()