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);
}
}
您在进入嵌套循环之前初始化了 i
和 k
,但是当内循环在下一次迭代中重新启动时您没有重置 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);
}
}
以下建议代码:
- 说明代码块应该如何完成
- 表示实际分配了多少内存
- 提醒您代码需要检查错误
- 表示如果发生错误如何处理
现在,建议的代码:
//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()
我第一次尝试三重指针。 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);
}
}
您在进入嵌套循环之前初始化了 i
和 k
,但是当内循环在下一次迭代中重新启动时您没有重置 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);
}
}
以下建议代码:
- 说明代码块应该如何完成
- 表示实际分配了多少内存
- 提醒您代码需要检查错误
- 表示如果发生错误如何处理
现在,建议的代码:
//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()