无法访问阵列中的数据

时间:2015-03-31 23:36:31

标签: c arrays malloc pass-by-reference

我正在从一个文件中读取(每行输出1个字)并将每一行放入一个数组中。但是,每当我尝试访问数组中的任何元素时,我都会遇到分段错误。非常感谢任何帮助。 *更新:添加了一个while循环来逐个抓取角色,但我仍然遇到分段错误

指针在这里制作:

char* ptr;

我通过这个函数传递了它:

fillDict(ptr,&size);
int fillDict(char* ptr,int *size)

它读取文件并将其放入数组:

    int i = -1;
    int numb;
    int wsize;
    while (fgets(word,30,file)!=NULL)
    {
            if (i==-1)
            {
                    if(word[strlen(word)-1]=='\n')
                    {
                            word[strlen(word)-1] = 0;
                    }
                    numb = atoi(word);
                    ptr = malloc(sizeof(char));
            }
            else
            {
                    if(word[strlen(word)-1]=='\n')
                    {
                            word[strlen(word)-1] = 0;
                    }
                    wsize = wsize+strlen(word);
                    ptr = realloc(ptr,wsize);

                    int j = 0;                     //added from here
                    while(j<strlen(word)-1)
                    {
                            printf("%d\n",j);
                            ptr[j] = word[j];      //crashes here
                            j++;
                    }
                    ptr[j] = '\0';                 //to here

                    size++;
            }
            i++;
    }
    printf("%s",ptr[0]);           //but fails here
    fclose(file);

2 个答案:

答案 0 :(得分:0)

正如@Jagannath所提到的,您将ptr变量视为二维数组。

实际上,您将其分配为一个简单的缓冲区。

示意:

ptr = [][][][][][][][][][][][][][\0];

然后,你有一个word,它也是一个简单的缓冲区,如下所示:

word = [h][e][l][l][o][\0];

如果要将word复制到ptr,则需要迭代两个缓冲区并逐个字符地复制,如下所示:

word = [h][e][l][l][o][\0];
        v  v  v  v  v
ptr  = [h][e][l][l][o][][][][][][][][][\0];

否则,您可以通过创建二维数组来创建word数组。

 ptr = [|][|][][]...[\0]
        v  v
       [h][w]
       [e][o]
       [l][r]
       [l][l]
       [o][d]
       [0][0]

最后,您的代码中存在缺陷。查看您的malloc(1) ...并且您的wsize永远不会被初始化,因此当您执行wsize = wsize+strlen(word);时,行为未定义。

答案 1 :(得分:0)

此代码显示了一些关于指针如何工作的基本误解。 ptr[i]相当于*(ptr+i)。这在代码的上下文中没有任何意义。因此它应该是一个char,但是你要为它指定一个char的指针。并且printf失败了,当然它会失败。它需要一个指向char的指针,但它会获取ptr指向的位置处的任何数据,并将其视为指针。这可能是一个禁止的内存位置,因此是段错误。即使它不是,它也不可能在超出边界之前到达空终止字节。