簡體   English   中英

C三重指針:無法將字符串復制到位置Triplepointer [x] [y]中,其中[x]大於1

[英]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);
    }
}

您已在進入嵌套循環之前初始化了ik ,但是當內部循環在下一次迭代中重新啟動時,您不會重置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);
    }
}

以下建議的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM