[英]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.