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