0

我正在编写一个简单的函数,它在链表的开头创建一个新节点。当我尝试执行该文件时,我的 Windows 命令错误窗口出现“a.exe 已停止工作”。

对我来说一个谜是,当我printf在 的正文中添加一个调用时insertNewNodeAtFront,代码执行时没有上述错误框。想法?

这是源文件:

#include <stdio.h>


typedef struct NodeTag{
    const char* Airport;
    struct NodeTag * Link;                
    } NodeType;


void insertNewNodeAtFront(NodeType *, const char*);


void insertNewNodeAtFront(NodeType * L,  const char* str){

    NodeType * N;
    N = L;    
    NodeType * NewFirst;
    NewFirst->Airport = str;
    NewFirst->Link = N;
    L = NewFirst;
   //printf("L->Airport: %s\n",L->Airport); <---This is the line that magically makes it work.
}

int main(){
    NodeType * myitinerary;
    insertNewNodeAtFront(myitinerary,"ONT");
    return 0;
}
4

4 回答 4

1

正如 hmjd 所说,崩溃是由使用未初始化的内存引起的。当您添加更多代码时它不会崩溃的原因是这会导致编译器在内存中移动东西,因此未初始化的变量指向不同的地方。

但是,它仍然很糟糕:您的代码仍然在内存中删除了一些随机位置,这很可能会导致下次崩溃。

于 2013-04-18T07:50:02.117 回答
1

该代码正在推迟一个未初始化的指针,导致未定义的行为

NodeType * NewFirst;
NewFirst->Airport = str;

在使用前分配内存NewFirst

NodeType* newFirst = malloc(sizeof(*newFirst));
if (newFirst)
{
}

printf()在未定义行为的表现中起主导作用,但不是原因。

此外,如果您希望更改对L调用者可见,则需要将指针的地址传递给insertNewNodeAtFront()C 通过值传递(请参阅http://c-faq.com/ptrs/passptrinit.html):

void insertNewNodeAtFront(NodeType** L,  const char* str){
    /* ...snip... */
    *L = NewFirst;
}

NodeType* myitinerary = NULL;
insertNewNodeAtFront(&myitinerary,"ONT");
于 2013-04-18T07:43:21.950 回答
0

当你的程序有未定义的行为时,各种各样的事情都可能发生。

具体来说,您实际上从未malloc为您的节点分配内存(使用 ),因此当您开始执行以下操作时NewFirst->Airport = str;- 它会覆盖内存中的随机地址(NewFirst 是一个未初始化的指针)。所有的赌注都取消了。在继续您的实现尝试之前,您可能应该搜索实现链接列表的示例代码。

于 2013-04-18T07:45:29.757 回答
0

而不是这段代码

 void insertNewNodeAtFront(NodeType * L,  const char* str){

        NodeType * N;
        N = L;    
        NodeType * NewFirst;
        NewFirst->Airport = str;
        NewFirst->Link = N;
        L = NewFirst;
       //printf("L->Airport: %s\n",L->Airport); <---This is the line that magically makes it work.
    }

使用此代码 insertFirst

void insertNewNodeAtFront(NodeType ** L,  const char* str){


    NodeType * NewFirst = malloc(sizeof(NodeType));
    NewFirst->Airport = str;
    NewFirst->Link = *L;
    *L = NewFirst;
    printf("L->Airport: %s\n",(*L)->Airport);
}

在主函数中

insertNewNodeAtFront(&myitinerary,"ONT");
于 2013-04-18T07:45:46.163 回答