【问题标题】:Failing to access data from an array无法访问数组中的数据
【发布时间】:2015-03-31 23:36:31
【问题描述】:

我正在从一个文件中读取(每行包含 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);

【问题讨论】:

  • ptr[i] = word; 您正在创建一维数组并试图将其视为二维。
  • 是的,而且看起来word 指向的内存可能不再有效,因为它超出了while循环的范围。

标签: c arrays malloc pass-by-reference


【解决方案1】:

正如@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); 时,行为是未定义的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-02-28
      • 1970-01-01
      • 2019-08-21
      • 2021-11-23
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多