return 来自 C 函数的二维数组
return 2D array from C function
受到this问题的启发。我创建了这个函数:
char** char2Da (int r, int c) {
char (*p)[c] = malloc(sizeof(char[r][c]));
// come code filling 2D array
return (char**) p;
}
不幸的是,它不起作用。为什么?是否可以 return 指向 C 中二维数组的指针并使用上面的方法保留 [][] 符号?如果不是,为什么?我在这里错过了什么?
我知道有一种解决方法,可以通过创建外部数组,将其通过 ref 传递给函数。但是它有点难看,我很乐意将所有内容封装在一个函数中。
请记住,我有 PHP 和 JavaScript 背景,您只需从函数中创建 arr[][] 和 return 即可。不客气。
类型char **
和char ( * )[c]
是不同的类型。例如,取消引用 char **
类型的第一个指针,您将获得存储在分配数组第一行的第一个字符中的值,该值不是指针。
您可以通过以下方式完成任务
void * char2Da (int r, int c) {
char (*p)[c] = malloc(sizeof(char[r][c]));
// come code filling 2D array
return p;
}
然后在调用者中写入
char ( *p )[c] = char2Da( r, c );
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
void * f( size_t r, size_t c )
{
char ( *p )[c] = malloc( sizeof( char[r][c] ) );
return p;
}
int main(void)
{
size_t r = 2, c = 3;
char ( *p )[c] = f( r, c );
free( p );
return 0;
}
或其他演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void * f( size_t r, size_t c )
{
char ( *p )[c] = malloc( sizeof( char[r][c] ) );
char value = 'A';
for ( size_t i = 0; i < r; i++ )
{
memset( p[i], value++, c );
p[i][c-1] = '[=13=]';
}
return p;
}
int main(void)
{
size_t r = 2, c = 3;
char ( *p )[c] = f( r, c );
for ( size_t i = 0; i < r; i++ ) puts( p[i] );
free( p );
return 0;
}
程序输出为
AA
BB
如果 c 是编译时常量,即您没有分配可变长度数组,那么函数声明可以类似于
#define C 10
char ( *char2Da (int r ) )[C];
受到this问题的启发。我创建了这个函数:
char** char2Da (int r, int c) {
char (*p)[c] = malloc(sizeof(char[r][c]));
// come code filling 2D array
return (char**) p;
}
不幸的是,它不起作用。为什么?是否可以 return 指向 C 中二维数组的指针并使用上面的方法保留 [][] 符号?如果不是,为什么?我在这里错过了什么?
我知道有一种解决方法,可以通过创建外部数组,将其通过 ref 传递给函数。但是它有点难看,我很乐意将所有内容封装在一个函数中。
请记住,我有 PHP 和 JavaScript 背景,您只需从函数中创建 arr[][] 和 return 即可。不客气。
类型char **
和char ( * )[c]
是不同的类型。例如,取消引用 char **
类型的第一个指针,您将获得存储在分配数组第一行的第一个字符中的值,该值不是指针。
您可以通过以下方式完成任务
void * char2Da (int r, int c) {
char (*p)[c] = malloc(sizeof(char[r][c]));
// come code filling 2D array
return p;
}
然后在调用者中写入
char ( *p )[c] = char2Da( r, c );
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
void * f( size_t r, size_t c )
{
char ( *p )[c] = malloc( sizeof( char[r][c] ) );
return p;
}
int main(void)
{
size_t r = 2, c = 3;
char ( *p )[c] = f( r, c );
free( p );
return 0;
}
或其他演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void * f( size_t r, size_t c )
{
char ( *p )[c] = malloc( sizeof( char[r][c] ) );
char value = 'A';
for ( size_t i = 0; i < r; i++ )
{
memset( p[i], value++, c );
p[i][c-1] = '[=13=]';
}
return p;
}
int main(void)
{
size_t r = 2, c = 3;
char ( *p )[c] = f( r, c );
for ( size_t i = 0; i < r; i++ ) puts( p[i] );
free( p );
return 0;
}
程序输出为
AA
BB
如果 c 是编译时常量,即您没有分配可变长度数组,那么函数声明可以类似于
#define C 10
char ( *char2Da (int r ) )[C];