首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分段故障(11)

分段故障(11)
EN

Stack Overflow用户
提问于 2014-01-21 10:21:49
回答 2查看 261关注 0票数 0

我的C程序有分割错误,我不知道为什么。它在“调试6”之后失败,然后打印出“分段错误(11)”。我有预感这是因为我的str_split_2函数。这个程序应该读取文件,第一行有n,然后n行有两个值"a,b“。我想把这些值保存到二维数组映射中。

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-21 10:30:31

我认为

代码语言:javascript
运行
复制
*map[i]=(int*) malloc(2*sizeof(int));

应该是

代码语言:javascript
运行
复制
(*map)[i]=(int*) malloc(2*sizeof(int));
map[0][i]=(int*) malloc(2*sizeof(int));

否则就意味着

代码语言:javascript
运行
复制
*(map[i])=(int*) malloc(2*sizeof(int));

这似乎是不对的。当然,同样的问题在

代码语言:javascript
运行
复制
    *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]);
票数 2
EN

Stack Overflow用户

发布于 2014-01-21 10:39:12

传递给strtok的第二个参数必须是指向以空结尾的字符串的指针(即字符串必须以0字符结尾)。

您正在传递一个指向字符变量(char delim)的指针,strtok从该地址“扫描”内存,直到遇到0值,因此很可能在某个时候执行非法的内存访问。

所有的str strcpy**,例程都是这样,例如strcpy**,** strlen**,** strcmp**.**

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21255315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档