C语言 无法访问阵列中的数据



我正在从文件中读取(每行有 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("%dn",j);
                            ptr[j] = word[j];      //crashes here
                            j++;
                    }
                    ptr[j] = '';                 //to here
                    size++;
            }
            i++;
    }
    printf("%s",ptr[0]);           //but fails here
    fclose(file);

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

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

示意图:

ptr = [][][][][][][][][][][][][][];

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

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

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

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

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

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

最后,你的代码有缺陷。看看你的malloc(1)...而且您的wsize永远不会初始化,因此当您执行此操作wsize = wsize+strlen(word);行为时,行为是未定义的。

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

相关内容

  • 没有找到相关文章