我的C程序中存在分段错误,我不知道为什么。它在“debug 6”之后失败,打印出来然后是“segment fault(11)。我有一个预感因为我的str_split_2函数。这个程序应该读取文件,第一行有n
,然后n行有两个值“a,b”。我想将这些值保存到二维数组映射。
char** str_split_2(char* str, const char delim)
{
char** result;
result=(char**)malloc(2*sizeof(char*));
result[0] = strtok(str, &delim);
result[1] = strtok(NULL, &delim);
return result;
}
int loadFile(int*** map, char* filename,int *n)
{
int i=0;
char *line = NULL;
size_t len;
FILE *fptr = fopen(filename, "r");
if(fptr == NULL)
{
fprintf(stderr, "Error opening a file: %s\n", filename);
return 1;
}
getline(&line, &len, fptr);
*n = atoi(line);
printf("n: %d\n",*n);
*map = (int**) malloc((*n)*sizeof(int*));
if(*map==NULL)
return 1;
char** sPosition=NULL;
printf("debug 0\n");
for(i=0; i<*n; i++)
{
*map[i]=(int*) malloc(2*sizeof(int));
printf("debut 1\n");
if(*map[i]==NULL)
return 1;
printf("debug 2\n");
getline(&line, &len, fptr);
sPosition=str_split_2(line,',');
printf("debug 3\n");
printf("%s\n%s\n",sPosition[0],sPosition[1]);
printf("debug 4\n");
*map[i][0]=atoi(sPosition[0]);
printf("debug 5 %d\n",*map[i][0]);
*map[i][1]=atoi(sPosition[1]);
printf("debug 6 %d\n",*map[i][1]);
printf("hello");
printf("%d:",i);
}
fclose(fptr);
free(line);
return 0;
}
答案 0 :(得分:2)
我认为
*map[i]=(int*) malloc(2*sizeof(int));
应该是
之一(*map)[i]=(int*) malloc(2*sizeof(int));
map[0][i]=(int*) malloc(2*sizeof(int));
否则就意味着
*(map[i])=(int*) malloc(2*sizeof(int));
这似乎是错误的。当然,同样的问题在于
*map[i][0]=atoi(sPosition[0]);
printf("debug 5 %d\n",*map[i][0]);
*map[i][1]=atoi(sPosition[1]);
printf("debug 6 %d\n",*map[i][1]);
答案 1 :(得分:0)
传递给strtok
的第二个参数必须是指向以null结尾的字符串的指针(即字符串必须以0字符结尾)。
您正在传递一个指向字符变量(char delim
)的指针,并且strtok
从该地址“扫描”内存,直到遇到0值,因此最有可能执行非法内存访问某点。
BTW,所有str
例程就是这种情况,例如strcpy
,strlen
,strcmp
。