簡體   English   中英

為什么realloc()在第二次循環后崩潰?

[英]why is realloc() crashing after the 2nd loop?

這只是一個測試代碼,我一直在使用它來弄清楚代碼是如何工作的,然后才將它強加到我的程序中。 基本上同樣的問題發生在兩個程序中,我能夠重新分配2次然后它崩潰。 最后的項目是2d指針,列表長度和大小長度。 其中的一部分必須能夠調整到合理的限度。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char** tasks;
    char buff[1089];
    int size, i, list_size=1;
    tasks = (char**)malloc(list_size * sizeof(char*));
    printf("input a string!\n");
    gets(buff);
    *tasks[0]=(char*)malloc((strlen(buff)+1));
    tasks[0]=buff;
    printf("%s\n", tasks[0]);

    for (i=1;i<8 ;i++){
        list_size++;
        printf("%d\n", list_size);
        *tasks = realloc(*tasks, list_size* sizeof(char*));
        printf("input a string!\n");
        gets(buff);
        *tasks[i]=(char*)malloc((strlen(buff)+1));
        tasks[i]=buff;
        printf("%s\n", tasks[i]);
    }

    free(tasks);
    return 0;
}

我在這里搞砸了什么?

這里有幾個問題。

*tasks[0]=(char*)malloc((strlen(buff)+1));

正如David Heffernan在評論中指出的那樣,您正在指定一個指向char的指針。 你可能只想分配給tasks[0]

tasks[0]=buff;

這不是您復制字符串的方式。 您將tasks[0]設置為指向固定緩沖區,並泄漏您在上一步中分配的內存。

*tasks = realloc(*tasks, list_size* sizeof(char*));

這不是一種重新分配的安全方法,而且您還在重新分配錯誤的指針(列表中的第一個條目,而不是列表本身)。 如果分配失敗,您丟失了原始指針,並泄露了該內存。 您應該首先重新分配到臨時變量,如下所示:

char *temp = realloc(tasks, list_size* sizeof(char*));
if (temp != NULL)
    tasks = temp;

最后,不要轉換malloc()的結果。

暫無
暫無

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

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