首页 > 解决方案 > 在结构中重新分配内存后出现奇怪的文本

问题描述

将字符串从指针打印到指针数组后会出现奇怪的字符。有时甚至像内存耗尽一样崩溃。这是为什么?每件事都需要动态。有时,如果我只写一两个原因,这些错误就不会发生。输出 - a═══asda 或 adsas═²²²²²²════⌡X╩▒2。

#define MAX_LENGTH 50
#define ONE 1
#define TWO 2
#define THREE 3
#define EXIT 4

typedef struct list
{
    char** reasons;

}list;

int main(void)
{
    list pros = { (char*)malloc(sizeof(char) * MAX_LENGTH) };
    list cons = { (char*)malloc(sizeof(char) * MAX_LENGTH) };
    char* reason = 0;
    char* dillema  = 0;
    reason = (char*)malloc(sizeof(char) * MAX_LENGTH);
    dillema = (char*)malloc(sizeof(char) * MAX_LENGTH);
    printf("What is your dillema? \n");
    fgets(dillema, MAX_LENGTH, stdin);
    dillema[strcspn(dillema, "\n")] = 0;
    dillema = (char*)realloc(dillema, sizeof(char) * strlen(dillema) + ONE);

        switch (selection)
        {
        case ONE:
            printf("Enter a reason to add to list PRO: \n");
            fgets(reason, MAX_LENGTH, stdin);
            reason[strcspn(reason, "\n")] = 0;
            reason = (char*)realloc(reason, (sizeof(char) * strlen(reason)) + 1);
            pros.reasons = (char**)realloc(pros.reasons, (sizeof(char*) * prosCounter) + 1);
            strcpy(pros.reasons + prosCounter, reason);
            prosCounter += ONE;
            break;
        case TWO:
            printf("Enter a reason to add to list CON: \n");
            fgets(reason, MAX_LENGTH, stdin);
            reason[strcspn(reason, "\n")] = 0;
            reason = (char*)realloc(reason, (sizeof(char) * strlen(reason)) + 1);
            cons.reasons = (char**)realloc(cons.reasons, (sizeof(char*) * consCounter) + 1);
            strcpy(cons.reasons + consCounter, reason);
            consCounter += ONE;
            break;
        case THREE:
            printf("Your dillema: \n%s \n\n", dillema);
            printf("LIST PROS\n_________ \n");
            for (i = 0; i < prosCounter; i++)
            {
                printf("%s \n", pros.reasons + i);
            }
            printf("LIST CONS\n_________ \n");
            for (i = 0; i < consCounter; i++)
            {
                printf("%s \n", cons.reasons + i);
            }
            printf("\n\n");
            break;
        case EXIT:
            break;

        }
    }
}

标签: c

解决方案


这些是导致问题的行(仅第二行,但我还显示了第一行以显示上下文):

pros.reasons = (char**)realloc(pros.reasons, (sizeof(char*) * prosCounter) + 1);
strcpy(pros.reasons + prosCounter, reason);

基本上,您将整个字符串复制到未初始化的指针中。

如果您只想指向字符串,请为其分配一个指针。如果你想要一个副本,你应该使用strndup()


推荐阅读