以下代码有什么问题?怎么纠正这个?

时间:2010-09-27 18:58:47

标签: c multidimensional-array

如何返回静态多维字符数组?

#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 个答案:

答案 0 :(得分:4)

首先,arr不能是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...

答案 1 :(得分:1)

鉴于声明

char arr[SIZE][SIZE];

然后表达式的类型 arrchar (*)[SIZE];因此,函数类型应为

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

是的,函数类型定义很难看。詹姆斯的typedef版本更容易阅读,但这就是幕后发生的事情。

int main(void)
{
  char (*arr1)[SIZE];
  int i, j;

  arr1 = myFunction();
  ...
}

答案 2 :(得分:0)

更改为静态字符** arr [] [] = ...

答案 3 :(得分:0)

谁拥有阵列?

这非常重要,因为代码的某些部分必须完全拥有(创建,删除)数组。代码的其他部分可以读写。

根据这种理念,我会修改代码,以便main函数(实际上,它可以是任何函数)获得arr1的所有权。 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,在大多数本地声明变量(ij有些是格式化的。程序主要用于与其他人类程序员进行通信,所以代码的可读性非常重要。

答案 4 :(得分:0)

conio.h + getch()不是ANSI C. void main不是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();
}