为什么程序在打印两个姓氏时会崩溃?
Why does the program crash upon printing the two lastnames?
看来我的程序在打印两个姓氏时崩溃了,我不明白为什么这个链表在打印两个姓氏时会崩溃。非常感谢任何帮助:((。我正在实现一个包含多个元素的链表,但是我只是打印了姓氏以查看列表是否会正确迭代,事实证明它在打印第二个姓氏 "programmer" 后崩溃了。
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;
}
}
TL;DR: 正如 lurker 上面评论的那样:你需要确保你的 pNext
指针明确指向 NULL
你的链表。
当您 malloc()
使用 C 系统从系统中获取内存时,它会尝试找到一个足够大的块来容纳您正在使用它的任何内容,但不会为您执行对该内存的清理 --你得到了上一个程序没有清理的任何垃圾。您看到的是 while 循环条件未触发,因为位于 pSecond->pNext
的任何内容都不是指向 NULL (0x0) 的指针。
最重要的是,如果您重新启动系统并 运行 程序几次,您可能会(不)幸运并 运行 进入场景 其中 pSecond->pNext
实际上恰好指向 NULL, 确实导致了相当混乱的情况。
奖励: 如果您希望函数调用为您处理初始化(归零)内存,请查看 void *calloc(size_t num_elements, size_t element_size);
.
看来我的程序在打印两个姓氏时崩溃了,我不明白为什么这个链表在打印两个姓氏时会崩溃。非常感谢任何帮助:((。我正在实现一个包含多个元素的链表,但是我只是打印了姓氏以查看列表是否会正确迭代,事实证明它在打印第二个姓氏 "programmer" 后崩溃了。
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;
}
}
TL;DR: 正如 lurker 上面评论的那样:你需要确保你的 pNext
指针明确指向 NULL
你的链表。
当您 malloc()
使用 C 系统从系统中获取内存时,它会尝试找到一个足够大的块来容纳您正在使用它的任何内容,但不会为您执行对该内存的清理 --你得到了上一个程序没有清理的任何垃圾。您看到的是 while 循环条件未触发,因为位于 pSecond->pNext
的任何内容都不是指向 NULL (0x0) 的指针。
最重要的是,如果您重新启动系统并 运行 程序几次,您可能会(不)幸运并 运行 进入场景 其中 pSecond->pNext
实际上恰好指向 NULL, 确实导致了相当混乱的情况。
奖励: 如果您希望函数调用为您处理初始化(归零)内存,请查看 void *calloc(size_t num_elements, size_t element_size);
.