代码之家  ›  专栏  ›  技术社区  ›  user366312

以下代码有什么问题?如何纠正?

  •  3
  • user366312  · 技术社区  · 15 年前

    #include<stdio.h>
    #include<conio.h>
    
    #define SIZE 3
    
    char ** MyFunction(void)
    {
        static char arr[SIZE][SIZE]={
                                        {'A', 'B', 'C'},
                                        {'D', 'E', 'F'},
                                        {'G', 'H', 'I'}
                                    };
        return arr;
    }
    
    void main(void)
    {
        char ** arr1 = NULL;
        int i=0;
        int j=0;
    
        arr1 = MyFunction();
    
        for(i=0 ; i<SIZE ; i++)
        {
            for(j=0 ; j<SIZE ; j++)
            {
                printf("%c, ", arr1[i][j]);
            }
    
            printf("\n");
        }
    
        getch();
    }
    
    5 回复  |  直到 15 年前
        1
  •  4
  •   James Curran    15 年前

    char** . 它是一个地址,但不是指针的地址——它是char[SIZE]的地址。

    我总是发现使用typedef将维度拆分更容易处理这些问题。

    #define SIZE 3 
    typedef char ROW[SIZE];   // a ROW type is an array of chars
    
    ROW* MyFunction(void) 
    { 
         static ROW arr[SIZE]={  // arr is an array of ROW objects 
                                        {'A', 'B', 'C'}, 
                                        {'D', 'E', 'F'}, 
                                        {'G', 'H', 'I'} 
                                    }; 
        return arr; 
    } 
    
    void main(void) 
    { 
        ROW* arr1 = NULL;
        // etc...
    
        2
  •  1
  •   John Bode    15 年前

    根据声明

    char arr[SIZE][SIZE];
    

    然后是 表达 arr char (*)[SIZE] ;因此,函数类型应为

    char (*myFunction(void))[SIZE] // myFunction returns a pointer to a SIZE-element
    {                              // array of char
      static char arr[SIZE][SIZE] = ...;
      return arr;
    }
    

    是的,函数类型定义很难看。James的typedef版本读起来更容易,但这是在封面下发生的事情。

    int main(void)
    {
      char (*arr1)[SIZE];
      int i, j;
    
      arr1 = myFunction();
      ...
    }
    
        3
  •  0
  •   zakirhas7    15 年前

        4
  •  0
  •   Arun    15 年前

    谁拥有这个阵列?

    这一点非常重要,因为代码的某些部分必须获得数组的完全所有权(创建、删除)。但代码的其他部分可以读写。

    main 函数(实际上,它可以是任何函数)拥有 arr1 . 主要的 创建

    #include <stdio.h>
    
    enum{ SIZE = 3 };
    
    void initArray( char arr[ SIZE ][ SIZE ] ) {
    
        char x = 'A';
    
        for( int i = 0; i < SIZE; i++ ) {
            for( int j = 0; j < SIZE; j++ ) {
                arr[ i ][ j ] = x;
                x += 1;
            }
        }
    }
    
    int main()
    {
        char arr1[ SIZE ][ SIZE ];
        initArray( arr1 );
    
        for( int i = 0; i < SIZE; i++ ) {
            for( int j = 0; j < SIZE; j++ ) {
                printf("%c, ", arr1[ i ][ j ]);
            }
            printf("\n");
        }
    }
    

    在花了几分钟的时间寻找之后,我发现了一个 good discussion on multi-dimensional array in C .

    另一边的评论。请注意,我在代码中做了一些其他更改,有些是设计更改(例如使用 enum 而不是 #define ,声明变量( i j 在大多数本地范围内),而有些正在格式化。程序主要用于与其他人类程序员进行通信,因此代码的可读性非常重要。

        5
  •  0
  •   user411313    15 年前

    conio.h+getch()不是ANSI C。 换一种新的,会更容易。

    #include<stdio.h>
    #include<conio.h>
    
    #define SIZE 3
    typedef char CHAR3[SIZE];
    
    CHAR3 *MyFunction(void)
    {
        static CHAR3 arr[]={
                                        {'A', 'B', 'C'},
                                        {'D', 'E', 'F'},
                                        {'G', 'H', 'I'}
                                    };
        return arr;
    }
    
    main(void)
    {
        CHAR3 *arr1 = NULL;
        int i=0;
        int j=0;
    
        arr1 = MyFunction();
    
        for(i=0 ; i<SIZE ; i++)
        {
            for(j=0 ; j<SIZE ; j++)
            {
                printf("%c, ", arr1[i][j]);
            }
    
            printf("\n");
        }
    
       getch();
    }