[英]C triple pointers: Unable to copy string into position triplepointer[x][y] with [x] being greater than 1
我第一次嘗試三重指針。 這個問題是我在哪里獲得有關如何分配三重指針的信息的,這是如何分配三重指針的信息:
//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");
否(這會使程序進入Segmentation Fault)。 是什么原因導致這種奇怪的行為? 我在內存分配部分找不到任何索引錯誤
問題出在您的循環中:
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]
未初始化,並且取消引用該指針會給您帶來不確定的行為 。
每次顯式初始化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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.