c中使用malloc的动态内存分配
Dynamic memory allocation in c using malloc
使用 malloc
分配了 50*sizeof(int)
的动态内存。正如我在某些文档中所读到的,紧接在下方的元素应该是使用 malloc
分配的内存大小(在我的例子中是 200 字节)。但是当我执行下面的代码时,得到的是 209 而不是 200!
#include<stdio.h>
#include<malloc.h>
int main()
{
int *p = (int *)malloc(sizeof(int)*50);
int i;
for(i = 0; i < 5; i++)
scanf("%d", &p[i]);
for(i = -1; i < 5; i++)
printf(" %d ", *((int *)(p+i)));
free(p);
}
有人可以帮忙解决问题吗?
这是未定义的行为。您正在访问 malloc()
return 编辑区域之外的内存,这是无效的。
如果它在某些上下文中是有效的,那是一个特定于实现的扩展,而不是您可以依赖或在一般情况下做的事情。
此外,请不要在 C 中转换 malloc()
的 return 值。打印可能只是:
printf(" %d ", p[i]);
您添加的星号和转换不是必需的,只需使用数组索引即可。
问题出在
的第一次迭代中
for(i=-1;i<5;i++)
printf(" %d ",*((int *)(p+i)));
此处,索引 -1
引用无效的内存位置并尝试访问调用 undefined behavior。
FWIW,在 C 中没有 wrap-around 数组索引,它是简单的指针算法,一旦指向分配的内存区域之外,就会命中 UB。
也就是说,
malloc.h
已弃用并且非常 linux 具体,最好使用 stdlib.h
来获取 malloc()
. 的前向定义
- Please see this discussion on why not to cast the return value of
malloc()
and family in C
..
告诉我您看到的文档中写有 malloc() 的 return 地址下面的元素告诉 malloc() 的大小。我刚刚阅读了 malloc() 的手册页,但我找不到也从未听说过它。我觉得你很困惑。除非你保留它,否则无法找出动态分配内存的大小。
使用 malloc
分配了 50*sizeof(int)
的动态内存。正如我在某些文档中所读到的,紧接在下方的元素应该是使用 malloc
分配的内存大小(在我的例子中是 200 字节)。但是当我执行下面的代码时,得到的是 209 而不是 200!
#include<stdio.h>
#include<malloc.h>
int main()
{
int *p = (int *)malloc(sizeof(int)*50);
int i;
for(i = 0; i < 5; i++)
scanf("%d", &p[i]);
for(i = -1; i < 5; i++)
printf(" %d ", *((int *)(p+i)));
free(p);
}
有人可以帮忙解决问题吗?
这是未定义的行为。您正在访问 malloc()
return 编辑区域之外的内存,这是无效的。
如果它在某些上下文中是有效的,那是一个特定于实现的扩展,而不是您可以依赖或在一般情况下做的事情。
此外,请不要在 C 中转换 malloc()
的 return 值。打印可能只是:
printf(" %d ", p[i]);
您添加的星号和转换不是必需的,只需使用数组索引即可。
问题出在
的第一次迭代中for(i=-1;i<5;i++)
printf(" %d ",*((int *)(p+i)));
此处,索引 -1
引用无效的内存位置并尝试访问调用 undefined behavior。
FWIW,在 C 中没有 wrap-around 数组索引,它是简单的指针算法,一旦指向分配的内存区域之外,就会命中 UB。
也就是说,
malloc.h
已弃用并且非常 linux 具体,最好使用stdlib.h
来获取malloc()
. 的前向定义
- Please see this discussion on why not to cast the return value of
malloc()
and family inC
..
告诉我您看到的文档中写有 malloc() 的 return 地址下面的元素告诉 malloc() 的大小。我刚刚阅读了 malloc() 的手册页,但我找不到也从未听说过它。我觉得你很困惑。除非你保留它,否则无法找出动态分配内存的大小。