在c中将2d数组从一个函数传递到另一个函数?

时间:2014-04-20 22:42:40

标签: c arrays pointers 2d

我正在尝试使用' x'制作一个空格网格。随机点缀。我已经设法做到这一点,但现在我想要一个单独的功能打印出2d阵列,但我发现很难这样做...任何帮助都会很棒,提前谢谢。

int* createEnvironment(int width, int height, int numOfX)
{
    int i, j;

    char array[width][height];

    for (i = 0; i < width; i++)
    {
    for( j = 0; j < height; j++)
    {
         array[i][j] = '.'; 
    }
}

srand(time(NULL));

for(i=0; i<numOfX; i++)
{
    int row = ((rand() % (width-1)) + 0);
    int col = ((rand() % (height-1)) + 0);

    array[row][col] = 'x';

}


return array;
}

然后打印出2d数组......

void printEnvironment(int* environment, int width, int height)
{
  int i, j;

  for (i = 0; i < (height-1) ; i++)
 {
     printf("\n");

     for( j = 0; j < (width-1); j++)
     {
          printf("%c", environment[i][j]); 
     }
 }    
}

int main(int argc, char *argv[])
{  
int height = 20;
int width = 80;
int numOfX = 100;
int* environment;

environment = createEnvironment(width, height , numOfX);
printEnvironment(environment, width, height);


system("PAUSE");    
return 0;
}

1 个答案:

答案 0 :(得分:1)

(看起来你有一个迷路},但这与答案无关)

在函数int* createEnvironment(int width, int height, int numOfX)中,执行char array[width][height];时,在堆栈中分配宽度x高度的内存块。然后你会使用一些for循环来填充某些位置的X.一切都很好。

问题是在堆栈上分配了array。一旦createEnvironment返回,放置在堆栈上的所有变量将不再有效,因为后续函数调用可能会使用这些内存区域。考虑这个问题的一个更简单的方法是考虑每个变量在程序中“存在”的位置。全局变量存在于程序中,任何人都可以访问。可以在main中访问main中的变量,也可以在main(即使用指针)调用的函数中访问。但是,如果从main调用函数A,其中声明了一些变量V,然后从main调用函数B,则B不能访问V,因为V只存在于main中。该问题的解决方案是将V传递回main以发送给B.

幸运的是,C标准库提供了malloc,它从堆中分配内存,而不是堆栈。在堆中分配内存时,无论从哪个上下文创建内存,它都存在于堆中。如果函数A使用malloc在堆中创建变量V,则可以从main,B或任何其他函数访问V,只要提供指向V的指针即可。这也是内存泄漏的来源;当从堆中分配空间时,如果没有使用free释放空间,则它将保持分配状态,直到程序结束。

简短的回答是用char array[width][height];替换行char * array = malloc(width * height * sizeof(char));。并非sizeof并非严格必要,因为char的大小为一个字节,但如果您将char更改为其他类型,则需要更改。

您还需要更新访问数组子元素的方式。由于数组的宽度和高度如果在堆中是不可知的,你将不得不提供数组的偏移量,这应该可以让你知道数组在C中的工作原理。我会留下那个让你弄明白的。