使用 free 理解 malloc 和指针递增
Understanding malloc and pointer incrementation with free
我试图理解以下代码的输出。
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p = (int *) malloc(sizeof(int));
*p = 42;
*(p+1) = 41;
printf("%d -- %d\n", *p, p);
printf("%d\n", p[0]);
printf("%d -- %d\n", p[1], p+1);
free(p);
printf("%d --- %d\n", *p, p);
printf("%d --- %d\n", p[1], p+1);
}
我一步一步的理解如下:
int *p = (int *) malloc(sizeof(int));
p 现在指向由 malloc.
返回的一块内存
*p = 42;
将值42存储在malloc返回的位置。
*(p+1) = 41;
将值41存储在与malloc返回值直接相邻的位置。
free(p);
释放p指向的space,它最初是通过调用malloc获得的,即int 42.
的位置
结果:
42 -- 14327824
42
41 -- 14327828
0 --- 14327824
0 --- 14327828
我的理解是地址14327824被malloc返回了。当语句
*(p+1) = 41;
被执行时,值41已经存储在一个块not returned中malloc,即 p+1.
调用 free 时,我了解到它释放了 p 指向的 space,即值 42.那为什么存储在p+1的值也被释放了呢?
此外,如果 malloc returns 指向未初始化存储块的指针 pt。 pt+1位置是否超出了malloc设置的存储区范围?
你正在做的是未定义的行为。
int *p = (int *) malloc(sizeof(int));
这将从 malloc
返回的地址开始分配 sizeof(int)
个字节。
当你这样做时
*(p+1) = 41;
您正在取消对尚未在堆上分配的内存位置的引用。它的地址是 p + sizeof(int)
,这是一个不受管理的地址。
这会产生未定义的行为,您通过观察结果得出的每一个结论都是无关紧要的。
我试图理解以下代码的输出。
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p = (int *) malloc(sizeof(int));
*p = 42;
*(p+1) = 41;
printf("%d -- %d\n", *p, p);
printf("%d\n", p[0]);
printf("%d -- %d\n", p[1], p+1);
free(p);
printf("%d --- %d\n", *p, p);
printf("%d --- %d\n", p[1], p+1);
}
我一步一步的理解如下:
int *p = (int *) malloc(sizeof(int));
p 现在指向由 malloc.
返回的一块内存*p = 42;
将值42存储在malloc返回的位置。
*(p+1) = 41;
将值41存储在与malloc返回值直接相邻的位置。
free(p);
释放p指向的space,它最初是通过调用malloc获得的,即int 42.
的位置结果:
42 -- 14327824
42
41 -- 14327828
0 --- 14327824
0 --- 14327828
我的理解是地址14327824被malloc返回了。当语句
*(p+1) = 41;被执行时,值41已经存储在一个块not returned中malloc,即 p+1.
调用 free 时,我了解到它释放了 p 指向的 space,即值 42.那为什么存储在p+1的值也被释放了呢?
此外,如果 malloc returns 指向未初始化存储块的指针 pt。 pt+1位置是否超出了malloc设置的存储区范围?
你正在做的是未定义的行为。
int *p = (int *) malloc(sizeof(int));
这将从 malloc
返回的地址开始分配 sizeof(int)
个字节。
当你这样做时
*(p+1) = 41;
您正在取消对尚未在堆上分配的内存位置的引用。它的地址是 p + sizeof(int)
,这是一个不受管理的地址。
这会产生未定义的行为,您通过观察结果得出的每一个结论都是无关紧要的。