我想不通,为什么这个小C程序的段错误:为什么C中的这段错误?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int in = atoi(argv[1]);
printf("Input %d\n",in);
int *n = (int *)malloc(in);
int j;
for (j=0;j<in;j++)
n[j] = j;
printf("Sanity check...\n");
char *c = (char *)malloc(1024*1024*20);
int i;
for (i=0; i<20*1024*1024;i++)
c[i] = i;
printf("No segfault. Yay!\n");
return 0;
}
编译时:
$ gcc的-O0 test.c的-o运行
输出:
$ ./run 1000
$输入1000
$完整性检查...
$ [1] 17529段错误(核心转储)./run 1000
现在,如果我移动的for循环的一个下来是这样的:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int in = atoi(argv[1]);
printf("Input %d\n",in);
int *n = (int *)malloc(in);
int j;
printf("Sanity check...\n");
char *c = (char *)malloc(1024*1024*20);
int i;
for (i=0; i<20*1024*1024;i++)
c[i] = i;
printf("No segfault. Yay!\n");
for (j=0;j<in;j++)
n[j] = j;
return 0;
}
一切正常..相同的编译步骤,这是输出:
$ ./run 1000
$输入1000
$完整性检查...
$无段错误。好极了!
为什么我在做一个大的20MB malloc的原因是尝试从我正在分析的代码中删除缓存效果。感觉这两个实现都应该可以工作,但是当malloc-20MB数组时,第一个实现会发生段错误。我在这里错过了很明显的东西吗
谢谢。
此外,malloc'的'铸造相当灰心。 – 2015-03-31 20:25:53
谢谢!所以我做了一些愚蠢的事情。啊。 – sidmontu 2015-03-31 20:31:07
@MichałSzydłowski为什么malloc的投射不受欢迎?没有一个有效的解释,你不能轻视有效的答案 – bizzehdee 2015-03-31 23:09:13