C - 在函数之间移动2D数组

时间:2015-04-17 12:14:54

标签: c

所以基本上,我正在学习函数和指针。我明白我不能直接从函数返回一个数组,而是需要使用指针。

在下面的代码中,您可以看到我正在使用函数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一个静态数组。 :)

1 个答案:

答案 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