我正在尝试使用' 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;
}
答案 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中的工作原理。我会留下那个让你弄明白的。