所以基本上,我正在学习函数和指针。我明白我不能直接从函数返回一个数组,而是需要使用指针。
在下面的代码中,您可以看到我正在使用函数char * generate_2D_array( )
来创建2D数组。我正在寻找一种方法,我可以在我的函数Menu()
中使这个数组工作。我此时的总体目标是能够打印2D array
。
当我生成2D数组并在同一方法中打印时,它可以正常工作。我得到一个12 x 12
点网格。但是,根据我的代码,我得到一个随机字符和空格的12 x 12
网格。请帮我解决这个问题!
当前输出为here
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int rand_num_gen( )
{
srand(time(NULL));
int randNum;
randNum = (rand() % 12);
printf("%d", randNum);
return randNum;
}
char rand_char_gen( )
{
char randChar = ' ';
int randNum = 0;
randNum = 26 * (rand() / (RAND_MAX + 1.0));
randNum = randNum + 97;
randChar = (char) randNum;
return randChar;
}
char * generate_2D_array( )
{
srand(time(NULL));
char grid[12][12];
char *p;
p = *grid;
int i, j;
for (i = 0;i < 12; i++)
{
for (j = 0; j < 12; j++)
{
grid[i][j] = '.'; //rand_char_gen( );
}
}
return grid;
}
void print_array(char * array)
{
int i, j;
for (i = 0; i < 12; i++)
{
for (j = 0; j < 12; j++)
{
printf("%c ", *array++);
}
printf("\n\n");
}
}
Menu()
{
char *myArray;
myArray = generate_2D_array( );
print_array(myArray);
printf("\nChoose a catagory: ");
printf("\nPleease select your number of choice...");
printf("\n1. Animals");
printf("\n2. Colors");
printf("\n3. Planets");
printf("\n4. Weekdays");
int valid = 0;
while(valid == 0)
{
printf("\n\nYour selection: ");
int catagory;
scanf("%d", &catagory);
if(catagory == 1)
{
printf("\n\nPlaceholder\n");
char word1[] = "dog";
int length = sizeof(myArray);
printf("myArray = %d", length);
valid++;
}
else if(catagory == 2)
{
printf("\n\nPlaceholder\n");
valid++;
}
else if(catagory == 3)
{
printf("\n\nPlaceholder\n");
valid++;
}
else if(catagory == 4)
{
printf("\n\nPlaceholder\n");
valid++;
}
else if(catagory > 4)
{
printf("\n\nInvalid input. Please select again.\n");
}
else if(catagory < 1)
{
printf("\n\nInvalid input. Please select again.\n");
}
}
}
编辑: 好的,所以我解决了这个问题。我需要做的就是让我的数组名为Grid一个静态数组。 :)
答案 0 :(得分:0)
局部变量就是它们所定义的函数的局部变量。这意味着当函数返回时,变量不再存在。返回并使用指向此类本地(且不存在)变量的指针会导致undefined behavior。
基本上有两种解决方案:在调用函数中创建数组,并将指针作为参数传递给它;或者从堆中动态分配数组并返回该指针。
只是一个与您的代码无关的简单示例,只是为了向您展示原则:
void initialize_array_of_arrays(char (*arr)[],
const size_t num_lines,
const size_t num_cols)
{
for (size_t line = 0; line < num_lines; ++line)
{
for (size_t col = 0; col < num_cols - 1; ++col)
{
arr[line][col] = 'A' + line;
}
arr[line][num_cols - 1] = '\0'; // Terminate as string
}
}
int main(void)
{
char arr[12][5];
initialize_array_of_arrays(arr, 12, 5);
for (size_t i = 0; i < 12; ++i)
printf("Line %d: %s\n", i, arr[i]);
}
预期产出:
AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII JJJJ KKKK LLLL