繁体   English   中英

在使用malloc的指针的情况下进行奇怪的内存分配

[英]Strange memory allocation in case of pointers using malloc

#include <stdio.h>
#include <stdlib.h>

int main()
{
int *a = (int *)malloc(sizeof(int));
//    int a[1];
int i;
for(i = 0; i < 876; ++i)
    a[i] = i;
printf("%d",a[799]);
}

即使使用malloc()仅分配1个int的空间,此代码也为什么起作用?

为什么此代码有效? 即使我使用malloc仅分配1 int空间? 在这种情况下,请以不确定的行为回答。

分配4个字节的块,如

  int *a = (int *)malloc(sizeof(int)); /* No need to cast the malloc result  */

并像那样访问

a[i] = i; /* upto i<1 behavior is guaranteed as only 4byte allocated, not after */

导致不确定的行为,即任何事情都可能发生,并且您不应该依赖它两次执行相同的操作。

旁注,由于malloc()返回类型void*及其自动安全地提升为所需类型,因此不需要强制类型转换malloc()的结果。 阅读我是否强制转换malloc的结果? 并始终检查返回值malloc() 例如

int *a = malloc(sizeof(int));
if( a != NULL) {
   /* allocated successfully & do_something()_with_malloced_memory() */ 
}
else {
    /* error handling.. malloc failed */ 
}

似乎正在工作。 绝对保证它在重新编译后或在其他环境中将以相同的方式工作。

基本上,您在这里尝试访问未分配给程序的内存地址(使用除0以外的任何索引)。 因此,从您的程序角度来看,内存地址无效 访问无效的内存位置会调用未定义的行为

正如其他人所解释的那样,在访问超出分配范围的内存区域时的行为是不确定的。 在运行内存密集型应用程序的系统上运行同一程序。 您可能会看到一个SIGSEGV。 通过Coverity静态分析运行代码,您将看到它捕获了缓冲区溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM