1

I'm having a problem with my program. I need my program to read from a text file, the first consists of the dimensions of the 2d array the rest is the contents of the array. I have coded the readWord function which reads from textfiles and it works but when i do anything on the main function with the array it crashes. Please could you help.

int main()

{
       int num_it, cols, rows;
       char** myworld;

       num_it = readWorld(myworld,&cols, &rows);

       myworld[1][2]='x';/*it crashes when i make this statement*/

}


int readWorld(char** world, int* width,int* height)
{
  int result=0,i,cols=0,rows=0;
  char buff[25];

   FILE* file = fopen ("world.txt", "r");

   fscanf(file, "%d %d %d\n", width, height, &result);

   /*Dynamic allocation*/
   world = (char**)malloc(*(height)* sizeof(char*));
    for(i=0;i<*height;i++)
    {
        world[i] = (char*)malloc(*width*sizeof(char));
    }

    /*store data in array*/
    while(fgets(buff, sizeof buff, file) != NULL)
    {
       if (strlen(buff) >1){

       for(cols=0; cols<=(strlen(buff)); ++cols)
       {
          world[rows][cols] = buff[cols];
       }      
       ++rows;
    }
}

fclose(file);

return result;

}

4

2 回答 2

2

您需要在实际调用者中为 myworld 分配内存!

这里发生的是您将指针按值传递给函数。

指针值由函数更改,但这不会调整调用者中的指针值。

两个选项:使用三重间接(即传递一个指针到指针)或在主子分配。我更喜欢后者,主要是因为你可以用更对称的方式控制内存释放;即使您解决了这个问题,您的代码仍然存在内存泄漏。

当您尝试访问程序不拥有的内存时,您遇到的是未定义的行为。

于 2013-05-20T17:06:32.620 回答
1

myworld在 main 中的变量从未初始化并指向垃圾,因此当您尝试访问它时会发生坏事。想一想为什么:您将变量的副本readWorld传递给. 您在那里正确分配内存,并使副本指向它,但原始指针 (in main) 仍然指向它之前指向的任何随机位置。

如果您希望在函数内部为其分配内存readWorld并通过myworld变量 in访问,main那么您必须将指针传递myworldreadWorld; 换句话说,你必须传递一个三重指针。

尝试这个:

int readWorld(char*** world, int* width,int* height)
{ 
    char **tempworld = malloc(...);

    // do whatever

    *world = tempworld;

    return result;
}

int main()
{
    char **myworld = NULL;

    readWorld(&myworld, ...);

    return 0;
}
于 2013-05-20T17:11:54.547 回答