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

📅  最后修改于: 2021-06-30 00:31:39             🧑  作者: 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);
}

这个问题的测验