考虑下面的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);
}
这个问题的测验