这段代码应该是用户输入的十个名字的链接列表
它应该把名单打印出来。

#include<stdio.h>
#include<stdlib.h>
struct NameList
{
    char *name;
    struct NameList *nname;
};
typedef struct NameList NL;

int main()
{
    int i;
    NL *first;
    NL *next;
    first = (NL*)malloc(sizeof(NL));
    if (first ==NULL)
            printf("Memory not properly allocated\n");
    NL *pNames;
    pNames =  first;
    for(i = 0; i<10; i++)
    {
            printf("Enter a name: ");
            scanf("%s", &pNames->name);
            if(i == 9)
                    next = NULL;
            else
                    next = (NL*)malloc(sizeof(NL));
            pNames->nname = next;
            pNames = pNames->nname;
    }

到目前为止没有问题,我输入了十个名字,但只要我输入
我的姓是分段错误。
我猜是从这里来的,但我一点也不确定
        pNames = first;
        while(pNames != NULL)
        {
                printf("%s\n", pNames->name);
                pNames = pNames->nname;
        }


    }

最佳答案

这一行是源代码:

printf("Enter a name: ");
scanf("%s", &pNames->name);

最好创建这样的静态缓冲区:
char buf[20];

然后
printf("Enter a name: ");
scanf("%s", buf);

最后:
pNames->name = strdup(buf);

编辑:为了完整起见,存在缓冲区溢出的风险。超过某些字符经过缓冲区末尾时,会导致未定义的行为。这可以按照@ebyrob的建议,以这种方式减轻
fgets(buf, 20, stdin);

关于c - 链表-段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33268192/

10-16 09:22