内存分配错误

时间:2016-06-27 18:15:25

标签: c malloc dynamic-memory-allocation

int main(void)
{
    // create a node
    node* list1 = malloc(sizeof(node));
    node* list2 = malloc(sizeof(node));
    list1 -> n = 2; 
    list2 -> n = 5;
    list1 -> next = list2;
    list2 -> next = NULL;

    if(search(5, list1))
        printf("True\n");
    else
        printf("False\n");

}

在上面的程序中,当我初始化类型node的变量时,我必须为这些变量显式分配内存,否则编译器会抛出错误。

bool search(int n, node* list)
{
    node* ptr = list;
    while(ptr != NULL)
    {
        if(ptr -> n == n)
        {
            return true;
        }
        ptr = ptr->next;
    }
    return false;
}  

但是,在上面的函数“search”中我有一个类型为node“ptr”的变量,但是我没有明确地为它分配内存。为什么这个函数没有错误?

2 个答案:

答案 0 :(得分:4)

在Q中添加警告是个好主意。但是,我认为它类似于“未初始化的变量”。

正如pm100的评论中所提到的,当程序执行时,您可能会遇到运行时错误。但是,它有相同的原因。

“已初始化”并不意味着“分配已分配的内存”,而是为其分配任何值。在search()中,您可以在此处正确执行此操作:

node* ptr = list;

main()中,如果您只有:

,则不会这样做
node* list1; // No initialization

BTW:编译器可以检测您是否为其分配NULL,然后使用->取消引用它。因此,如果您有这样的代码,可能会出现错误:

node* list1 = NULL;
list1 -> n = 2; // Dereferencing NULL pointer constant

但是编译器是否检测到它取决于他。同样,在运行时,无论哪种情况都会出错。

答案 1 :(得分:3)

  

我有一个类型为“ptr”的变量,但是我没有明确地为它分配内存。为什么这个功能没有错误?

ptr不是node类型。代码有一个名为ptr的变量,它是指针,可以输入node

以下代码为指针创建了空间。

node* ptr = list;