Память Malloc для строки C внутри структуры

#c #struct #char #malloc #pointers

#c #структура #символ #malloc #указатели

Вопрос:

В настоящее время у меня есть следующий код.

     struct qnode
    {
        char *path;
        struct qnode *next;
    }

    typedef struct qnode Node;
  

Однако на этом этапе мой код завершается с ошибкой, когда я пытаюсь использовать пространство malloc для for внутри struct qnode.

 void add(Node *front, Node *back,char **path)
{
    /* Create the new node */
    Node *cur = (Node *)malloc(sizeof(Node));

    /* Verify node successfully created */
    if(cur)
    {
            /* Populate Members of Node */
            cur->path = malloc(strlen(*path)); /* fails here */
            printf("Malloc path success");
            cur->path = *path;
  

Я проверил, что strlen действительно работает с правильным указателем и действительно возвращает длину size . По какой-то причине, хотя на данный момент я получаю ошибку сегментации, и я не понимаю, почему.

Например, это часть назначения, ОДНАКО эта простая строка malloc не является чем-то, что было специально назначено, и не использовало язык C. Мне разрешено использовать c для задания, но я выбрал C, чтобы получить больше знаний о языке.

Спасибо за помощь!

Комментарии:

1. Какой тип path ? Почему вы отбрасываете указатель, возвращаемый вторым malloc ?

Ответ №1:

Вы не выделяете достаточно памяти. Вам нужно оставить место для нулевого терминатора. Вы также должны скопировать содержимое строки, а не назначать указатель на строку. Обе эти ошибки приведут к повреждению кучи и объяснят вашу ошибку. Код должен быть таким:

 cur->path = malloc(strlen(*path) 1);
printf("Malloc path success");
strcpy(cur->path, *path);
  

Вы, конечно, можете использовать strdup , если она доступна в вашей системе, но обратите внимание, что она не является частью стандарта C.

Комментарии:

1. Спасибо за помощь. Я понял, что пропустил часть strcpy, но забыл зайти и изменить это. Моя ошибка на самом деле была простой маленькой ошибкой в дальнейшем, но если вы заметили, что мои «временные» инструкции отладки не совсем полезны, поскольку я забыл включить n для очистки выходного буфера, чтобы сообщение действительно печаталось в нужное время. Спасибо за помощь, хотя! И я не знал о strdup, и я просто проверил, что он находится в моей системе, что немного упрощает задачу. Также значение, возвращаемое strlen(*path), действительно является фактическим размером, включая ‘ 0’, поскольку я только что исследовал это.

2. Бен, тебе нужно расследовать свое расследование. strlen определенно не должен считать завершающий ‘ 0’.

3. @Бен Найджел прав. strlen не учитывает никаких символов. Вы, должно быть, неправильно поняли.