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() 的手册页,但我找不到也从未听说过它。我觉得你很困惑。除非你保留它,否则无法找出动态分配内存的大小。