#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
не учитывает никакихсимволов. Вы, должно быть, неправильно поняли.