访问大堆数组时出现分段错误(核心已转储)
Segmentation fault (core dumped) when access large heap array
我们知道 Segmentation fault (core dumped) 是由非法内存引起的 access.But 我不认为这是我的程序的原因。
运行 linux 上的以下 c 代码,当变量 l=20 时,它可以工作,但当 l=50 时,我得到了分段错误(核心已转储)。我的笔记本是ubuntu18.04,8核,16G内存。
//
// Created by sakura on 2020/4/11.
//
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void *emalloc(size_t n);
int main(){
printf("begin alloc...\n");
char* rv;
int l=50;
for(int i=0;i<l;i++){
rv=emalloc(1024*1024*100);
sleep(1);
}
printf("finish alloc...\n");
for(int i=0;i<l;i++){
for(int j=0;j<1024*1024*100;j++){
int a = rand();
rv[i*1024*1024*100+j]=(a%128);
}
}
printf("finish access...\n");
sleep(300);
return 0;
}
void fatal(char *s1,char *s2,int n){
fprintf(stderr,"Error: %s, %s\n",s1,s2);
exit(n);
}
void *emalloc(size_t n){
void *rv;
if((rv=malloc(n))==NULL){
fatal("out of memory","",1);
}
return rv;
}
在这一行使用 i = 50
时出现整数溢出:
rv[i*1024*1024*100+j]=(a%128);
这会导致未定义的行为(参见 this question)。
50*1024*1024*100
的值等于5242880000
,但最大值为int
类型的变量(参见[=20=中的INT_MAX
常数]) 是 2147483647
.
我建议您考虑为 i
变量使用不同的数据类型,例如 size_t
.
我们知道 Segmentation fault (core dumped) 是由非法内存引起的 access.But 我不认为这是我的程序的原因。
运行 linux 上的以下 c 代码,当变量 l=20 时,它可以工作,但当 l=50 时,我得到了分段错误(核心已转储)。我的笔记本是ubuntu18.04,8核,16G内存。
//
// Created by sakura on 2020/4/11.
//
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void *emalloc(size_t n);
int main(){
printf("begin alloc...\n");
char* rv;
int l=50;
for(int i=0;i<l;i++){
rv=emalloc(1024*1024*100);
sleep(1);
}
printf("finish alloc...\n");
for(int i=0;i<l;i++){
for(int j=0;j<1024*1024*100;j++){
int a = rand();
rv[i*1024*1024*100+j]=(a%128);
}
}
printf("finish access...\n");
sleep(300);
return 0;
}
void fatal(char *s1,char *s2,int n){
fprintf(stderr,"Error: %s, %s\n",s1,s2);
exit(n);
}
void *emalloc(size_t n){
void *rv;
if((rv=malloc(n))==NULL){
fatal("out of memory","",1);
}
return rv;
}
在这一行使用 i = 50
时出现整数溢出:
rv[i*1024*1024*100+j]=(a%128);
这会导致未定义的行为(参见 this question)。
50*1024*1024*100
的值等于5242880000
,但最大值为int
类型的变量(参见[=20=中的INT_MAX
常数]) 是 2147483647
.
我建议您考虑为 i
变量使用不同的数据类型,例如 size_t
.