如何在 c 中 return char (*)[6]?
How to return char (*)[6] in c?
我想按字母顺序对字符串数组进行排序,这是 c 中字符数组的数组 order.Here 是我函数的主体:-
char (*)[6] sort_strings ( char (*sptr) [6])
{
//code.
//return a pointer of type char (*)[6].
}
但是这种return类型不被compiler.It识别,给出错误提示:-
expected identifier or '(' before ')' token
那么如何 return 一个 char (*)[6] 类型的指针呢?我还有一个问题,先看main()
如下:-
int main(){
char names[5][6] = {
"tom",
"joe",
"adam"
};
char (*result)[6] = sort_strings (names);
//code for printing the result goes here.
return 0;
}
所以我的下一个问题是,当我调用 sort strings (names)
时,编译器也会给我警告:-
initializing makes pointer from integer without a cast
所以我的问题是:-
1. 如何从函数中 return char(*)[6]?
2. 为什么我调用这个函数时编译器给我警告?
我是 运行 这段代码在 windows 的代码块上。
如果您坚持对特定 6 个字符串的数组进行排序,您可以将其打包成一些 struct
,例如
struct sixstrings_st {
char* ptrarr[6];
};
但是,您可能希望对任意数量的字符串进行排序。然后你要么将该数字作为另一个正式参数传递(你也可以有一些其他的约定,比如在一些全局中存储数组的大小,但这很丑陋):
void sort_strings (char**arrptr, unsigned siz);
或者您可以使用 flexible array members.
顺便说一句,不要重新发明排序,使用 qsort(3)
此外,出于可读性的目的,您通常不希望拥有复杂的类型。使用 typedef
,并根据需要定义尽可能多的 struct
(可能使用 union
-s)。
小心使用数组。在许多情况下(特别是传递给函数的参数),一个数组 衰减 为一个指针(请注意,处理器通常不会在一条机器指令中一次处理整个数组)。一个函数不能真正 return 一个数组,只是一个指针(或一些 struct
)。
在 C 编程中,函数 returning 标量 数据(例如整数或某些指针)是很常见的。返回一个 struct
不是很常见(与 C++ 相反,在 C++ 中 returning 一个 class
实例很常见)。当你做 return a struct
你通常希望它是 "small enough" (否则函数 return 在概念上必须复制很多字节)。顺便说一句,Linux 上的一些 ABI-s may have specific rules for returning a struct
of two scalar elements. For x86-64 ABI,带有两个整数或两个指针的 struct
return 通过两个机器寄存器编辑。
通常,函数是 returning 指针(可能由 malloc
获得并填充到函数中),您应该定义一个约定并记录应该使用 [=72= 做什么]ed 指针,特别是谁负责 free
它以及如何。 C 编程中的一个常见习惯用法是定义创建函数 foo_create
,它分配一个复杂的数据结构 struct foo_st
(通常通过调用 malloc
来分配一些 struct
和其他创建函数来分配它组件)和 return 指向它的指针,并销毁正在销毁此类数据结构的函数 foo_destroy
(通常通过销毁组件然后在作为 [=30 传递的整个结构上调用 free
=]指针)。
一般来说,在C你要避免传递或者returning largedata structures (such as big struct
-s, arrays, union
-s, ...) to and from functions (to avoid a lot of data to be copied, since C calling convention is call by value). So you carefully use pointers to them instead: avoid memory leaks and memory corruption. Hence you don't return a sorted array, but some pointer to it (and you document who should destroy that array, how and when) ... Read about C dynamic memory allocation and even about garbage collection (at least to know the terminology, and basic techniques like reference counting).
最后,您通常不想在源代码中硬编码像 6 这样的大小。您应该想要处理任意(但合理)大小的任意字符串数组。如果您需要硬编码尺寸,至少给它一些可读的名称,例如在适当的地方使用 #define MY_WEIRD_SIZE 6
和代码 MY_WEIRD_SIZE
而不是 6...
函数声明看起来像变量声明,只是变量名被函数名和参数代替。所以:
// asdf is a pointer to an array of 6 chars
char (*asdf)[6];
// sort_strings is a function returning a pointer to an array of 6 chars
// (and with an argument which is a pointer to an array of 6 chars)
char (*sort_strings ( char (*sptr)[6] )) [6];
我想按字母顺序对字符串数组进行排序,这是 c 中字符数组的数组 order.Here 是我函数的主体:-
char (*)[6] sort_strings ( char (*sptr) [6])
{
//code.
//return a pointer of type char (*)[6].
}
但是这种return类型不被compiler.It识别,给出错误提示:-
expected identifier or '(' before ')' token
那么如何 return 一个 char (*)[6] 类型的指针呢?我还有一个问题,先看main()
如下:-
int main(){
char names[5][6] = {
"tom",
"joe",
"adam"
};
char (*result)[6] = sort_strings (names);
//code for printing the result goes here.
return 0;
}
所以我的下一个问题是,当我调用 sort strings (names)
时,编译器也会给我警告:-
initializing makes pointer from integer without a cast
所以我的问题是:-
1. 如何从函数中 return char(*)[6]?
2. 为什么我调用这个函数时编译器给我警告?
我是 运行 这段代码在 windows 的代码块上。
如果您坚持对特定 6 个字符串的数组进行排序,您可以将其打包成一些 struct
,例如
struct sixstrings_st {
char* ptrarr[6];
};
但是,您可能希望对任意数量的字符串进行排序。然后你要么将该数字作为另一个正式参数传递(你也可以有一些其他的约定,比如在一些全局中存储数组的大小,但这很丑陋):
void sort_strings (char**arrptr, unsigned siz);
或者您可以使用 flexible array members.
顺便说一句,不要重新发明排序,使用 qsort(3)
此外,出于可读性的目的,您通常不希望拥有复杂的类型。使用 typedef
,并根据需要定义尽可能多的 struct
(可能使用 union
-s)。
小心使用数组。在许多情况下(特别是传递给函数的参数),一个数组 衰减 为一个指针(请注意,处理器通常不会在一条机器指令中一次处理整个数组)。一个函数不能真正 return 一个数组,只是一个指针(或一些 struct
)。
在 C 编程中,函数 returning 标量 数据(例如整数或某些指针)是很常见的。返回一个 struct
不是很常见(与 C++ 相反,在 C++ 中 returning 一个 class
实例很常见)。当你做 return a struct
你通常希望它是 "small enough" (否则函数 return 在概念上必须复制很多字节)。顺便说一句,Linux 上的一些 ABI-s may have specific rules for returning a struct
of two scalar elements. For x86-64 ABI,带有两个整数或两个指针的 struct
return 通过两个机器寄存器编辑。
通常,函数是 returning 指针(可能由 malloc
获得并填充到函数中),您应该定义一个约定并记录应该使用 [=72= 做什么]ed 指针,特别是谁负责 free
它以及如何。 C 编程中的一个常见习惯用法是定义创建函数 foo_create
,它分配一个复杂的数据结构 struct foo_st
(通常通过调用 malloc
来分配一些 struct
和其他创建函数来分配它组件)和 return 指向它的指针,并销毁正在销毁此类数据结构的函数 foo_destroy
(通常通过销毁组件然后在作为 [=30 传递的整个结构上调用 free
=]指针)。
一般来说,在C你要避免传递或者returning largedata structures (such as big struct
-s, arrays, union
-s, ...) to and from functions (to avoid a lot of data to be copied, since C calling convention is call by value). So you carefully use pointers to them instead: avoid memory leaks and memory corruption. Hence you don't return a sorted array, but some pointer to it (and you document who should destroy that array, how and when) ... Read about C dynamic memory allocation and even about garbage collection (at least to know the terminology, and basic techniques like reference counting).
最后,您通常不想在源代码中硬编码像 6 这样的大小。您应该想要处理任意(但合理)大小的任意字符串数组。如果您需要硬编码尺寸,至少给它一些可读的名称,例如在适当的地方使用 #define MY_WEIRD_SIZE 6
和代码 MY_WEIRD_SIZE
而不是 6...
函数声明看起来像变量声明,只是变量名被函数名和参数代替。所以:
// asdf is a pointer to an array of 6 chars
char (*asdf)[6];
// sort_strings is a function returning a pointer to an array of 6 chars
// (and with an argument which is a pointer to an array of 6 chars)
char (*sort_strings ( char (*sptr)[6] )) [6];