📜  门| GATE-CS-2017(套装1)|问题 27

📅  最后修改于: 2021-09-25 07:22:31             🧑  作者: Mango

考虑以下 C 代码:

#include 

int * assignval (int *x, int val)
{
    *x = val;
    return x;
}

int main()
{
    int *x = malloc(sizeof(int));
    if (NULL == x) return;
    x = assignval(x, 0);
    if(x)
    {
        x = (int*) malloc(sizeof (int));
        if (NULL == x) return;
        x = assignval (x, 10);
    }
    printf("%d\n", *x);
    free(x);
}

该代码存在以下问题之一:
(A)编译器错误,因为 malloc 的返回没有正确类型转换。
(B)编译器错误,因为比较应为 x==NULL 而不是如图所示。
(C)编译成功但执行可能导致悬空指针。
(D)编译成功但执行可能导致内存泄漏。答案: (D)
说明:代码将运行并给出输出 = 10,因此丢弃选项 A 和 B。

int * x= malloc (sizeof(int));

此语句为 x 分配一个位置。现在,

(int*)malloc(sizeof(int));

再次为 x 分配一个新位置,之前的内存位置丢失了,因为现在我们没有对该位置的引用导致内存泄漏。

因此,选项 D 是正确的。

当程序员在堆中创建内存并忘记删除它时,就会发生内存泄漏。内存泄漏对于守护进程和服务器等程序来说是特别严重的问题,这些程序根据定义永远不会终止。
关于内存泄漏的详细文章

问题的运行代码:

#include
int *assignval (int *x, int val) 
{
    *x = val;
    return x;
}
  
void main () 
{
    int *x = malloc(sizeof(int));
    if (NULL == x) return;
    x = assignval (x,0);
    if (x)
    {
        x = (int *)malloc(sizeof(int));
        if (NULL == x) return;
        x = assignval (x,10);
    }
    printf("%d\n", *x);
    free(x);
}

这个问题的测验