c - 内存分配错误

标签 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");

}

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

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

但是,在上面的函数“搜索”中,我有一个类型为节点“ptr”的变量,但我没有为它显式分配内存就通过了。为什么这个函数没有错误?

最佳答案

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

正如 pm100 的评论中所述,当程序执行时,您可能会遇到运行时错误。然而,它有同样的原因。

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

node* ptr = list;

main() 中你不需要这样做,如果你只有:

node* list1; // No initialization

顺便说一句:编译器可以检测您是否将 NULL 分配给它,然后使用 -> 取消引用它。因此,如果您有这样的代码,则可能会出错:

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

但是编译器是否检测到这一点取决于他。同样,在运行时,无论哪种情况,您都会遇到错误。

关于c - 内存分配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060569/

相关文章:

c++ - 为什么 11==011 返回 false?

c - 如何在 C 中的结构中初始化 const(使用 malloc)

c++ - 二维动态数组程序崩溃

c - 分配后访问结构体成员

c - 运行一次调节的宏

凯撒密码和反向文本程序

linux - 有没有办法确定 free() 是否会失败?

c++ - C++ 中类成员的动态分配

c - 为什么大小为 '0' 的 realloc 允许多次释放指针,但大小为 '0' 的 malloc 不允许?

c - 为什么我不能取消引用指向多维数组的指针?