Почему функция strcpy () выдает нежелательные результаты в случае этой программы? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать связанный список в C, и этот пост относится к той части, где я пытаюсь присвоить переменной в структуре строковое значение, которое вводит пользователь.Программа отлично компилируется, но если я использую strcpy () вместо strdup (), то получаю нежелательный вывод.

Программа компилируется нормально и не выдает предупреждений или ошибок.Если используется strdup (), тогда программа работает так, как задумано, но я хотел бы знать, почему она не работает, когда вместо нее используется strcpy ().При передаче строк для имен, когда список печатается, он иногда печатает ноль, а затем завершается или вместо этого выводит «Имя: Имя: Имя: Имя: Имя» или другие подобные непредсказуемые ошибки.Буду признателен за любые другие комментарии или критику, так как я только начинаю изучать язык, спасибо.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct addressBook {
    char *name;
    int age;
    char *phoneNumber;
    struct addressBook *next;
};

static struct addressBook *head = NULL;
static struct addressBook *current;
static struct addressBook *createNew;

//function prototypes
void addNode(void);
struct addressBook * createNode(void);
void printAddressBook(void);
void printStats(void);


int main(void)
{
    addNode();
    addNode();
    printAddressBook();
    addNode();
    addNode();
    printAddressBook();
}

struct addressBook * createNode(void)
{
    struct addressBook *newNode;
    newNode = (struct addressBook *) malloc(sizeof(struct addressBook));

if (newNode == NULL)
{
    puts("Memory error");
    exit(1);
}

printf("\nEnter persons name: ");
char name[20];
scanf("%s", name);
strcpy(newNode -> name, name); //produces unpredictable results
//newNode -> name = strdup(name);   Works fine with strdup

printf("Enter persons age: ");
scanf("%d", &newNode -> age);

printf("Enter persons phone number: ");
char phoneNumber[15];
scanf("%s", phoneNumber);
strcpy(newNode -> phoneNumber, phoneNumber); //produces unpredictable 
results
//newNode -> phoneNumber = strdup(phoneNumber);  Works fine with strdup

return(newNode);
}

void addNode(void)
{
    createNew = createNode();
    current = createNew;
    current -> next = head;
    head = current;
}

void printAddressBook(void)
{
    struct addressBook *temp;
    temp = head;
    while(temp)
    {
        printf("Name: %s\nAge: %d\nPhoneNumber: %s\n\n\n",
               temp -> name,
               temp -> age,
               temp -> phoneNumber);
        temp = temp -> next;
    }
}

1 Ответ

0 голосов
/ 29 декабря 2018

Когда вы определяете указатель наподобие char *name;, он указывает на какое-то случайное место, поскольку вы его не инициализировали.Запись в указатель недопустима, и при этом будет вызвано неопределенное поведение.

strcpy в основном записывает строку в это случайное расположение указателя, вызывая UB.
strdup с другой стороны, выделяетдинамически требуется память для строки, копирует строку в это место и затем возвращает начало расположения.Вы можете читать / писать в эту ячейку памяти, и, следовательно, это действительно.

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