关于free函数和内存分配的问题(C)
Question about free function and memory allocation ( C )
我试图理解 C 中的指针和内存分配。所以我有这些 C 代码行:
int *a=0; // a pointer which points to 0
a = (int*)malloc(5*sizeof(int)); // now the pointers a points to the adress of our allocated memory, right ?
if (a == 0)
{
fprintf(stderr, "Error\n");
exit(EXIT_FAILURE);
}
printf("The value of a is %p\n", a); // this is the adress of our allocated memory
a=readArray(5); // a function which reads and array // What happens here? I read an array in that memory which I allocated, right ?
printf("Now the value of a is: %p\n", a); // Now the adress is the adress of first array element, right?
if (a != 0)
{
free(a);
a=0;
}
这个程序的输出是:
The value of a is 0x7ff780c03160
Now the value of a is: 0x7ff780c03180
现在我需要选择一个关于自由函数调用的答案。
1. Deallocates the both allocated memory zones.
2. Deallocates the memory starting at adress 0x7ff780c03180 and fill that zone with zeros.
3. Deallocates the memory starting at adress 0x7ff780c03180
4. Deallocates the memory starting at adress 0x7ff780c03160
根据我读到的关于自由函数的内容,它释放了整个内存,建议用 0 初始化指针。所以我认为答案是第一个变体,1。我说得对吗?
readArray
无法访问 a
(a
不是全局变量,也不会传递给 readArray
),这意味着 readArray
必须分配一个新数组并 return 它。然后将该数组分配给 a
,在此过程中丢失对原始 malloc
ed 数组的引用。
free
调用应用于从 0x7ff780c03180
开始的新数组,做出正确答案 #3。
不,free()
只会释放传递给它的指针所指定的内存块。因此,这将释放从地址 0x7ff780c03180 开始的内存,地址 0x7ff780c03160 处的内存将被泄漏。
答案是3
。
在行 a=readArray(5);
中,您将丢失前一个指针(在您的示例中为 160)。你不能再 free
这个内存了,所以你有内存泄漏。 ==> 1
和 4
不可能是正确答案。
free
不会用零填充内存,a=0
也只会将指针变量设置为 0
,但不会对内存做任何操作 ==> 2
不是正确答案。
不,free
不会释放比传递给它的分配指针更多的内存。您列表中的正确答案是 3。free
将在那个时间点释放 a
指向的内存,仅此而已。它不会用零或其他任何内容填充该内存区域。
此外,当您 readArray(5)
时,您会创建分配新内存并保留之前分配的旧内存。所以你在做什么 step-by-step:
- 使用
malloc
分配了一些内存(我们称之为X
)并将其地址存储在变量a
. 中
- 调用
readArray
,它将分配一些其他内存(我们称它为Y
)并将其地址存储在a
。
- 释放存储在
a
中的内存,这是 Y
分配的内存块。
现在标记为 X
的内存将处于悬空状态,这意味着您没有对它的任何引用,也无法解除分配它。它只是分配的内存,无法再访问,因为您丢失了指向它的指针。
我试图理解 C 中的指针和内存分配。所以我有这些 C 代码行:
int *a=0; // a pointer which points to 0
a = (int*)malloc(5*sizeof(int)); // now the pointers a points to the adress of our allocated memory, right ?
if (a == 0)
{
fprintf(stderr, "Error\n");
exit(EXIT_FAILURE);
}
printf("The value of a is %p\n", a); // this is the adress of our allocated memory
a=readArray(5); // a function which reads and array // What happens here? I read an array in that memory which I allocated, right ?
printf("Now the value of a is: %p\n", a); // Now the adress is the adress of first array element, right?
if (a != 0)
{
free(a);
a=0;
}
这个程序的输出是:
The value of a is 0x7ff780c03160
Now the value of a is: 0x7ff780c03180
现在我需要选择一个关于自由函数调用的答案。
1. Deallocates the both allocated memory zones.
2. Deallocates the memory starting at adress 0x7ff780c03180 and fill that zone with zeros.
3. Deallocates the memory starting at adress 0x7ff780c03180
4. Deallocates the memory starting at adress 0x7ff780c03160
根据我读到的关于自由函数的内容,它释放了整个内存,建议用 0 初始化指针。所以我认为答案是第一个变体,1。我说得对吗?
readArray
无法访问 a
(a
不是全局变量,也不会传递给 readArray
),这意味着 readArray
必须分配一个新数组并 return 它。然后将该数组分配给 a
,在此过程中丢失对原始 malloc
ed 数组的引用。
free
调用应用于从 0x7ff780c03180
开始的新数组,做出正确答案 #3。
不,free()
只会释放传递给它的指针所指定的内存块。因此,这将释放从地址 0x7ff780c03180 开始的内存,地址 0x7ff780c03160 处的内存将被泄漏。
答案是3
。
在行 a=readArray(5);
中,您将丢失前一个指针(在您的示例中为 160)。你不能再 free
这个内存了,所以你有内存泄漏。 ==> 1
和 4
不可能是正确答案。
free
不会用零填充内存,a=0
也只会将指针变量设置为 0
,但不会对内存做任何操作 ==> 2
不是正确答案。
不,free
不会释放比传递给它的分配指针更多的内存。您列表中的正确答案是 3。free
将在那个时间点释放 a
指向的内存,仅此而已。它不会用零或其他任何内容填充该内存区域。
此外,当您 readArray(5)
时,您会创建分配新内存并保留之前分配的旧内存。所以你在做什么 step-by-step:
- 使用
malloc
分配了一些内存(我们称之为X
)并将其地址存储在变量a
. 中
- 调用
readArray
,它将分配一些其他内存(我们称它为Y
)并将其地址存储在a
。 - 释放存储在
a
中的内存,这是Y
分配的内存块。
现在标记为 X
的内存将处于悬空状态,这意味着您没有对它的任何引用,也无法解除分配它。它只是分配的内存,无法再访问,因为您丢失了指向它的指针。