如何返回静态多维字符数组?
#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();
}
答案 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];
然后表达式的类型 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;
}
是的,函数类型定义很难看。詹姆斯的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
,在大多数本地声明变量(i
,j
有些是格式化的。程序主要用于与其他人类程序员进行通信,所以代码的可读性非常重要。
答案 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();
}