首页 > 解决方案 > 当我错过 C 中的动态内存分配时,为什么不会出现编译错误?

问题描述

假设我正在尝试编写一个在 C 中创建简单链表的函数。

函数是这样的:

node* createLinkedList(int n) {

    int i = 0;
    node* head = NULL;
    node* temp = NULL;
    node* p = NULL;

    for (i = 0; i < n; i++) {

        //create isolated node

        temp = malloc(sizeof(node));
        printf_s("\nEnter the data for node number %i:", i);
        scanf_s("%d", &(temp->data));
        temp->next = NULL;

        if (head == NULL) {
            //if list is empty then make temp as first node
            head = temp;
        }
        else {
            p = head;
            while (p->next != NULL)
                p = p->next;
            p->next = temp;
        }
    }
    return head;
}

如果我故意删除temp = malloc(sizeof(node));程序编译的行,但我得到一个运行时错误(显然)。

我的问题是:编译器不应该警告我没有为temp变量分配内存吗?它是否隐式分配该内存?如果是这样,怎么做?

标签: cmemorycompilationmalloc

解决方案


根据定义,malloc不会隐式分配内存。这个函数的目的是返回一个有效的内存地址,这显然不能被编译器验证,因为它会在运行时被调用。

此时,编译器只是假设指针是有效的。它无法猜测指针是否已经指向有效的内存地址。


推荐阅读