如何 return 来自 C 函数的字符数组?
How can I return a character array from a function in C?
这可能吗?
假设我想要 return 两个字符的数组
char arr[2];
arr[0] = 'c';
arr[1] = 'a';
来自函数。我什至使用什么类型的功能?我唯一的选择是使用指针并使函数无效吗?到目前为止,我已经尝试过使用 char* 函数或 char[]。显然你只能有 char(*[]) 的函数。我想避免使用指针的唯一原因是函数在遇到 "return something;" 时必须结束,因为 "something" 的值是一个可能改变大小的字符数组(不是字符串!)取决于我通过主函数传递给函数的值。感谢任何提前回复的人。
可以把数组传给函数,让函数修改,像这样
void function(char *array)
{
array[0] = 'c';
array[1] = 'a';
}
然后
char array[2];
function(array);
printf("%c%c\n", array[0], array[1]);
如果你想要它作为一个 return 值,你应该使用动态内存分配,
char *function(void)
{
char *array;
array = malloc(2);
if (array == NULL)
return NULL;
array[0] = 'c';
array[1] = 'a';
return array;
}
然后
char *array = function();
printf("%c%c\n", array[0], array[1]);
/* done using `array' so free it because you `malloc'ed it*/
free(array);
重要提示:
你应该知道上面填充的数组不是字符串,所以你不能这样做
printf("%s\n", array);
因为 "%s"
期望传递匹配的字符串,并且在 c 中数组不是字符串,除非它的最后一个字符是 '[=16=]'
,所以对于 2 个字符的字符串,您需要分配space 为 3 个字符并将最后一个设置为 '[=16=]'
.
您有多种选择:
1) 使用 malloc()
在 堆 上分配您的数组,并 return 指向它的指针.您还需要自己记录长度:
void give_me_some_chars(char **arr, size_t *arr_len)
{
/* This function knows the array will be of length 2 */
char *result = malloc(2);
if (result) {
result[0] = 'c';
result[1] = 'a';
}
/* Set output parameters */
*arr = result;
*arr_len = 2;
}
void test(void)
{
char *ar;
size_t ar_len;
int i;
give_me_some_chars(&ar, &ar_len);
if (ar) {
printf("Array:\n");
for (i=0; i<ar_len; i++) {
printf(" [%d] = %c\n", i, ar[i]);
}
free(ar);
}
}
2) 为 caller[=32] 的 stack 上的数组分配 space =],并让调用的函数填充它:
#define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0]))
/* Returns the number of items populated, or -1 if not enough space */
int give_me_some_chars(char *arr, int arr_len)
{
if (arr_len < 2)
return -1;
arr[0] = 'c';
arr[1] = 'a';
return 2;
}
void test(void)
{
char ar[2];
int num_items;
num_items = give_me_some_chars(ar, ARRAY_LEN(ar));
printf("Array:\n");
for (i=0; i<num_items; i++) {
printf(" [%d] = %c\n", i, ar[i]);
}
}
不要尝试这样做
char* bad_bad_bad_bad(void)
{
char result[2]; /* This is allocated on the stack of this function
and is no longer valid after this function returns */
result[0] = 'c';
result[1] = 'a';
return result; /* BAD! */
}
void test(void)
{
char *arr = bad_bad_bad_bad();
/* arr is an invalid pointer! */
}
您可以 return 函数中的数组指针,但是您不能 return 指向本地数组的指针,引用将会丢失。
所以你有 3 个选择:
使用全局变量:
char arr[2];
char * my_func(void){
arr[0] = 'c';
arr[1] = 'a';
return arr;
}
使用动态分配(调用者有责任在使用后释放指针;在您的文档中明确说明)
char * my_func(void){
char *arr;
arr = malloc(2);
arr[0] = 'c';
arr[1] = 'a';
return arr;
}
让调用者分配数组并作为参考(我的建议)
void my_func(char * arr){
arr[0] = 'c';
arr[1] = 'a';
}
如果你真的需要return数组的函数,你可以return相同的参考:
char * my_func(char * arr){
arr[0] = 'c';
arr[1] = 'a';
return arr;
}
因为你有一个预先确定的数组大小,如果你用结构包装它,你实际上可以 return 数组:
struct wrap
{
char a[2] ;
} ;
struct wrap Get( void )
{
struct wrap w = { 0 } ;
w.a[0] = 'c';
w.a[1] = 'a';
return w ;
}
char* getCharArray()
{
return "ca";
}
这非常有效:
int comm_read_data(int file_i2c, unsigned char** buffer)
{
*buffer = malloc(BUFFER_SIZE);
if (i2c_read_bytes(file_i2c, *buffer, BUFFER_SIZE) != 0)
{
return -1;
}
return BUFFER_SIZE;
}
然后调用函数:
unsigned char* buffer;
int length = comm_read_data(file_i2c, &buffer);
/* parse the buffer here */
free(buffer);
这可能吗? 假设我想要 return 两个字符的数组
char arr[2];
arr[0] = 'c';
arr[1] = 'a';
来自函数。我什至使用什么类型的功能?我唯一的选择是使用指针并使函数无效吗?到目前为止,我已经尝试过使用 char* 函数或 char[]。显然你只能有 char(*[]) 的函数。我想避免使用指针的唯一原因是函数在遇到 "return something;" 时必须结束,因为 "something" 的值是一个可能改变大小的字符数组(不是字符串!)取决于我通过主函数传递给函数的值。感谢任何提前回复的人。
可以把数组传给函数,让函数修改,像这样
void function(char *array)
{
array[0] = 'c';
array[1] = 'a';
}
然后
char array[2];
function(array);
printf("%c%c\n", array[0], array[1]);
如果你想要它作为一个 return 值,你应该使用动态内存分配,
char *function(void)
{
char *array;
array = malloc(2);
if (array == NULL)
return NULL;
array[0] = 'c';
array[1] = 'a';
return array;
}
然后
char *array = function();
printf("%c%c\n", array[0], array[1]);
/* done using `array' so free it because you `malloc'ed it*/
free(array);
重要提示:
你应该知道上面填充的数组不是字符串,所以你不能这样做
printf("%s\n", array);
因为 "%s"
期望传递匹配的字符串,并且在 c 中数组不是字符串,除非它的最后一个字符是 '[=16=]'
,所以对于 2 个字符的字符串,您需要分配space 为 3 个字符并将最后一个设置为 '[=16=]'
.
您有多种选择:
1) 使用 malloc()
在 堆 上分配您的数组,并 return 指向它的指针.您还需要自己记录长度:
void give_me_some_chars(char **arr, size_t *arr_len)
{
/* This function knows the array will be of length 2 */
char *result = malloc(2);
if (result) {
result[0] = 'c';
result[1] = 'a';
}
/* Set output parameters */
*arr = result;
*arr_len = 2;
}
void test(void)
{
char *ar;
size_t ar_len;
int i;
give_me_some_chars(&ar, &ar_len);
if (ar) {
printf("Array:\n");
for (i=0; i<ar_len; i++) {
printf(" [%d] = %c\n", i, ar[i]);
}
free(ar);
}
}
2) 为 caller[=32] 的 stack 上的数组分配 space =],并让调用的函数填充它:
#define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0]))
/* Returns the number of items populated, or -1 if not enough space */
int give_me_some_chars(char *arr, int arr_len)
{
if (arr_len < 2)
return -1;
arr[0] = 'c';
arr[1] = 'a';
return 2;
}
void test(void)
{
char ar[2];
int num_items;
num_items = give_me_some_chars(ar, ARRAY_LEN(ar));
printf("Array:\n");
for (i=0; i<num_items; i++) {
printf(" [%d] = %c\n", i, ar[i]);
}
}
不要尝试这样做
char* bad_bad_bad_bad(void)
{
char result[2]; /* This is allocated on the stack of this function
and is no longer valid after this function returns */
result[0] = 'c';
result[1] = 'a';
return result; /* BAD! */
}
void test(void)
{
char *arr = bad_bad_bad_bad();
/* arr is an invalid pointer! */
}
您可以 return 函数中的数组指针,但是您不能 return 指向本地数组的指针,引用将会丢失。
所以你有 3 个选择:
使用全局变量:
char arr[2]; char * my_func(void){ arr[0] = 'c'; arr[1] = 'a'; return arr; }
使用动态分配(调用者有责任在使用后释放指针;在您的文档中明确说明)
char * my_func(void){ char *arr; arr = malloc(2); arr[0] = 'c'; arr[1] = 'a'; return arr; }
让调用者分配数组并作为参考(我的建议)
void my_func(char * arr){ arr[0] = 'c'; arr[1] = 'a'; }
如果你真的需要return数组的函数,你可以return相同的参考:
char * my_func(char * arr){
arr[0] = 'c';
arr[1] = 'a';
return arr;
}
因为你有一个预先确定的数组大小,如果你用结构包装它,你实际上可以 return 数组:
struct wrap
{
char a[2] ;
} ;
struct wrap Get( void )
{
struct wrap w = { 0 } ;
w.a[0] = 'c';
w.a[1] = 'a';
return w ;
}
char* getCharArray()
{
return "ca";
}
这非常有效:
int comm_read_data(int file_i2c, unsigned char** buffer)
{
*buffer = malloc(BUFFER_SIZE);
if (i2c_read_bytes(file_i2c, *buffer, BUFFER_SIZE) != 0)
{
return -1;
}
return BUFFER_SIZE;
}
然后调用函数:
unsigned char* buffer;
int length = comm_read_data(file_i2c, &buffer);
/* parse the buffer here */
free(buffer);