c - 为什么在这个程序中 strcpy() 函数会产生不需要的输出?

标签 c string linked-list

我正在尝试用 C 语言创建一个链表,这篇文章提到了我尝试为结构中的变量分配用户输入的字符串值的部分。该程序编译完美,但如果我使用 strcpy() 而不是 strdup(),那么我会得到不需要的输出。

程序编译良好,没有给出任何警告或错误。如果使用 strdup() 那么程序会按预期工作,但我想知道为什么在使用 strcpy() 时它不起作用。当为名称传递字符串时,当打印列表时,它偶尔会打印 null 然后终止,或者它会打印“Name:Name:Name:Name:Nam”或其他此类不可预测的错误。任何其他评论或批评将不胜感激,因为我刚刚开始学习这门语言,谢谢。

#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;
    }
}

最佳答案

当你定义一个像 char *name; 这样的指针时,它指向某个随机位置,因为你还没有初始化它。写入指针是非法的,这样做会调用未定义的行为。

strcpy 基本上是将字符串写入这个调用 UB 的随机指针位置。
另一方面,strdup 为字符串动态分配所需的内存,将字符串复制到该位置,然后返回该位置的开始。您可以读/写此内存位置,因此这是有效的。

关于c - 为什么在这个程序中 strcpy() 函数会产生不需要的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53967081/

相关文章:

C IPC等待 child

java - 从Java中的数组/集合的每个元素中剥离字符

c - 我的循环链表不显示最后一个节点

c - 这个链表程序中每一行的作用是什么?

c - 使用循环链表实现Queue

c - 结构体数组;输入多个字符串

python - 文件系统原型(prototype)制作

C - 计算数组中数字的频率

c++ - 编译器通常会对字符串进行特殊优化吗?

javascript - 分割字符串后数组值为 'Undefined'?