Ошибка при попытке печати строки из массива динамических строк через структуру - PullRequest
0 голосов
/ 27 апреля 2019

Моя программа должна получить строку от пользователя через fgets в массив динамических строк (char **) внутри указателя на структуру, а затем распечатать ее. вместо этого я получаю сообщение об ошибке всякий раз, когда я печатаю.

В этом примере я напечатаю только первую часть списка, потому что она все равно отправляет ошибку

Это моя структура:

typedef struct list
{
    char** items;
    int count; //number of items in the list.
}list;

Код перед отправкой «списка» функции, которая получает ввод от пользователя:

list tempList; // Generic names to demonstrate the case
list *myList = &tempList;

// Resetting the list to default values...
myList->count = 0;
myList->items = (char**)malloc(1); 
//Setting the string array size to 1, later i increase it as i get input from the user

myList = addItem(myList);
list *addItem(list *myList)
{
    /*
    The function gets a list adds a string from the user and raises the count by 1
    */
    char tempStr[STR_LEN] = ""; //temp string so i can later assign it dynamically 
    int size = sizeof(myList->items); //getting the existing length of the list
    // getting the string
    printf("Enter String:\n"); 
    fgets(tempStr, STR_LEN, stdin);
    //

    myList->items = realloc(myList->items, size + 1); //adds room for 1 more item in the list
    size = size + 1;
    myList->items[size - 1] = malloc(strlen(tempStr)); //accesing the cell and assigning memory 
    strcpy(myList->items[size - 1], tempStr);
    myList->count++;
    return myList;
}

наконец, печать элемента:

printf("%s", myList->items[0]);

Я знаю, что это много кода, но это так мало, как я могу показать

после получения ввода от пользователя, когда он должен напечатать VS, приостанавливает работу программы и открывает stdio.h в новом окне с сообщением «Вышло исключение: нарушение прав чтения».

Я никогда не получал эту ошибку раньше, и я не мог понять, что это значит для меня.

1 Ответ

0 голосов
/ 27 апреля 2019

ваши ошибки:

 int size = sizeof(myList->items);

, что не дает размер ранее выделенного динамического массива

использование count для знанияномер элемента уже присутствует

и

 myList->items = realloc(myList->items, size + 1); //adds room for 1 more item in the list

недостаточно перераспределить, потому что размер не является номером элемента (не существует char ), должно быть:

myList->items = realloc(myList->items, (myList->count + 1) * sizeof(char *)); //adds room for 1 more item in the list

и переменная size не требуется, поэтому ( malloc должно быть длиной строки больше 1для нулевого символа):

myList->items[myList->count] = malloc(strlen(tempStr) + 1); //accesing the cell and assigning memory 
strcpy(myList->items[myList->count], tempStr);
myList->count++;

Обратите внимание, что при инициализации с

 myList->items = (char**)malloc(1);

вы можете сделать

myList->items = malloc(0);

и cast бесполезен


Бесполезно для addItem возвращать список, потому что это всегда аргумент myList


Код получает все замечания в аккаунте (я также удаляю бесполезные myList в начале)

list tempList; // Generic names to demonstrate the case

// Resetting the list to default values...
tempList.count = 0;
tempList.items = malloc(0); 
//Setting the string array size to 0, later i increase it as i get input from the user

addItem(&tempList);

и

void addItem(list *myList)
{
    /*
    The function gets a list adds a string from the user and raises the count by 1
    */
    char tempStr[STR_LEN]; //temp string so i can later assign it dynamically 

    // getting the string
    printf("Enter String:\n"); 
    fgets(tempStr, STR_LEN, stdin);
    //

    myList->items = realloc(myList->items, (myList->count + 1) * sizeof(char *)); //adds room for 1 more item in the list

    myList->items[myList->count] = malloc(strlen(tempStr) + 1); //accesing the cell and assigning memory 
    strcpy(myList->items[myList->count], tempStr);
    myList->count++;
}

Обратите внимание, что вы неt проверить возвращаемое значение fgets (для случая EOF) или удалить вероятный символ новой строки в конце

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