C - malloc和数组混淆

nir*_*avb 7 c arrays malloc

我试图掌握C中的malloc函数,并编写了以下代码:

int i;

int *arr = (int*)malloc(5*sizeof(int)); 

if(arr==NULL){

  printf("Failed to allocate memory for arr...\n");
  exit(1);

}
Run Code Online (Sandbox Code Playgroud)

我认为这意味着只有5个元素可以添加到数组中.为了测试这是否属实,我添加了以下代码:

arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
arr[5] = 6;
arr[6] = 7;
arr[7] = 8;
arr[8] = 9;

for(i=0;i<9;i++){

    printf("%d\n",arr[i]);

}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,该代码编译并运行完美.怎么可能?

Lev*_*von 9

C不强制执行任何数组边界检查,因此当您请求5个整数的空间时,您使用了更多.

事实上,你覆盖了4个真正没有为你的特定用途预留的内存位置.你的程序经过了为你的数组预留的内存区域,并开始将值存储在分配区域之外的内存中.

事实上,这种"有效"只是纯粹的运气而不是依赖于它.它可能在接下来的100次工作,或者下次尝试时可能会失败,很可能是"分段错误"消息.

防御性编程,就像你通过明智地检查malloc的返回值,注意负责边界检查,编译启用了高警告级别的代码等等,是防御这些错误的一些最好的防御.其他工具,如valgrind,lint类型的检查器也可以提供帮助,但最终还是取决于你.

C的最大优势之一,它自由地做各种各样的事情,低级和高级,也是IMO最大的弱点之一.如果Java是沃尔沃,那么C或许更像是法拉利,有时候会有不稳定的突破:)