Странный текст появляется после перераспределения памяти в структуре - PullRequest
0 голосов
/ 06 мая 2019

Странные символы появляются после печати строк из указателя на массив указателей.Иногда даже вылетает, как память закончилась.Это почему?Каждая вещь должна быть динамичной.Иногда, если я пишу только одну или две причины, таких ошибок не бывает.вывод - 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;

        }
    }
}

1 Ответ

0 голосов
/ 06 мая 2019

Это строки, вызывающие проблему (только вторая строка, но я показываю также первую, отображающую контекст):

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

По сути, вы копируете целую строку в неинициализированный указатель.

Если вы просто хотите указать на строку, присвойте ей указатель.Если вы хотите копию, вы должны использовать strndup()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...