打印两个姓氏时为什么程序会崩溃?

时间:2015-04-12 00:51:57

标签: c linked-list

似乎我的程序在打印两个姓氏时崩溃了,我无法理解为什么这个链表会在打印两个姓氏时崩溃。非常感谢任何帮助:((。我正在实现一个包含多个元素的链接列表,但是我只是打印了姓氏以查看列表是否会正确迭代,结果显示它在打印第二个姓氏“程序员”后崩溃。

struct user
{

     char email[30];
     char lastname[30];
     char firstname[30];
     char phonenumber[20]; 
     char status [50];
     char password [50];

};


struct nodeTag {
    struct user  data;
    struct nodeTag *pNext; 
    struct nodeTag *pPrev;
};

typedef struct nodeTag nodeStructType;


int main(){

    nodeStructType *pFirst;
    nodeStructType *pSecond;
    nodeStructType *pRun;

    pFirst = malloc(sizeof(nodeStructType));
    strcpy(pFirst->data.email,"art@yahoo.com");
    strcpy(pFirst->data.password,"artist");
    strcpy(pFirst->data.lastname,"iamaartist");
    strcpy(pFirst->data.firstname,"artist");
    strcpy(pFirst->data.status,"Hello i am a artist");
    strcpy(pFirst->data.phonenumber,"092712345678");
    pSecond= malloc(sizeof(nodeStructType));

    pFirst->pNext=pSecond;
    strcpy(pSecond->data.email,"programming@yahoo.com");
    strcpy(pSecond->data.password,"programmer");
    strcpy(pSecond->data.lastname,"programmer");
    strcpy(pSecond->data.firstname,"programmer");
    strcpy(pSecond->data.status,"Hello i am a programmer");
    strcpy(pSecond->data.phonenumber,"092712345678");


    pRun=pFirst;
    while(pRun->pNext!=NULL){
    printf("%s\n", pRun->data.lastname);
    pRun=pRun->pNext;
   }

}

1 个答案:

答案 0 :(得分:1)

TL; DR:正如潜伏者在上面评论的那样:您需要确保您的pNext指针明确指向链接列表末尾的NULL。< / p>

当您从C系统中malloc()内存时,它会尝试找到一个足够大的块,以容纳您正在使用它的任何内容,但不会为您执行内存清理 - 你'得到最后一个程序没有清理的垃圾。你所看到的是while循环条件没有触发,因为pSecond->pNext处的任何内容都不是指向NULL(0x0)的指针。

最重要的是,如果重新启动系统并运行程序几次,您可能会(非)幸运并遇到 pSecond->pNext实际上碰巧指向的情景 NULL,确实导致了相当混乱的情况。

加分:如果您希望函数调用为您处理初始化(归零)内存,请查看void *calloc(size_t num_elements, size_t element_size);