如何解决将内存重新分配为空引用
我正在观看malloc
上的一堂课,而当他们在做一个具体的例子时,为什么这样的代码能打印出整个指针毫无意义。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *list = malloc(3 * sizeof(int));
if (list == NULL)
return 1;
list[0] = 1;
list[1] = 2;
list[2] = 3;
int *tmp = malloc(4 * sizeof(int));
if (tmp == NULL)
return 1;
for (int i = 0; i < 3; i++)
tmp[i] = list[i];
tmp[3] = 4;
free(list);
//From this line and below is the thing in question.
list = tmp;
for (int i = 0; i < 4; i++)
printf("%i\n",list[i]);
}
输出:
~/test/ $ ./malloc_test
1
2
3
4
据我对free()
的理解,它会取消分配函数分配的内存,而free()
将“释放”指针的内存。
如果我按照这个定义:
-
*list
被分配了12个字节(3 * sizeof(int)
,sizeof(int) = 4
- 带有数字的硬编码
list
-
*tmp
被分配了16个字节 - 将
list
中的数字复制到tmp
- 释放列表,使其没有分配的字节数
- 列表现在等于tmp
-
当
list
没有分配的内存时,tmp
现在等于list
吗? -
list
是否指向tmp
的地址?如果是的话,为什么自代码前面的步骤以来我们不需要为list
分配内存,我们做了int *tmp = malloc(4 * sizeof(int));
解决方法
*list
被分配了12个字节(3 * sizeof(int),sizeof(int)= 4
准确地说,您分配了12个字节的内存,并将list
设置为指向该内存。
带有数字的硬编码
list
*tmp
被分配了16个字节
准确地说,您再次分配了16个字节的内存,并将指针变量tmp
设置为指向它。
将
list
中的数字复制到tmp
释放list
,使其没有分配的字节数
确切地说,您释放了list
指向的对象,因此现在list
指向垃圾并且不能被取消引用。
list
现在等于tmp
确切地说,list
现在指向tmp
指向的同一对象,您分配的先前的16个字节仅由tmp
指向。
当列表没有分配的内存时,
list
现在如何等于tmp
?
以前,list
没有指向已分配的内存。但是您将其更改为指向您每秒分配的16个字节。指针的值就是它所指向的值,list
和tmp
现在指向相同的事物,因此它们具有相同的值。因此,它们现在相等。
列表是否指向tmp的地址?如果是,为什么我们从代码的前面就不需要为列表分配内存,我们这样做是int * tmp = malloc(4 * sizeof(int));
该代码释放第一个分配的内存块。如果它不分配第二个内存块,则任何指针指向的都将无效!
,复制指针时,您只是复制指针的值 1 :
base-api
这意味着banana
cake
apple
...
现在包含list = tmp;
指针的副本,或者换句话说,它们都指向相同的内存地址。在这种情况下,该地址就是分配。
一旦它们完全相同,您就可以互换引用它们。
1 当然,这假定指针的类型相同,例如list
到tmp
,而不是int*
到int*
。您还可以将其分配给int
,然后稍后再转换回去,效果也很好。
指针是一种数据类型,仅分配了相应数据类型的内存地址,在list = tmp;
中,您分配了用int * tmp = malloc (4 * sizeof (int));
创建的那个内存块的第一个位置,当您进行分配以列出它将指向该内存地址。 (在您的情况下,该内存块的开头)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。