我把这个东西搞了一阵子,但我真的不明白。
我想做的事情是:在函数中以2D字符数组作为输入,更改其中的值,然后返回另一个2D字符数组。
简单的想法,但在C语言中实现并不容易。
有没有什么简单的方法可以让我开始呢?谢谢。
我把这个东西搞了一阵子,但我真的不明白。
我想做的事情是:在函数中以2D字符数组作为输入,更改其中的值,然后返回另一个2D字符数组。
简单的想法,但在C语言中实现并不容易。
有没有什么简单的方法可以让我开始呢?谢谢。
C语言不会从函数中返回数组。
您可以做一些相似的事情:
You can package your array in struct
and return
that. C will return struct
s from functions just fine. The downside is this can be a lot of memory copying back and forth:
struct arr {
int arr[50][50];
}
struct arr function(struct arr a) {
struct arr result;
/* operate on a.arr[i][j]
storing into result.arr[i][j] */
return result;
}
You can return a pointer to your array. This pointer must point to memory you allocate with malloc(3)
for the array. (Or another memory allocation primitive that doesn't allocate memory from the stack.)
int **function(int param[][50]) {
int arr[][50] = malloc(50 * 50 * sizeof int);
/* store into arr[i][j] */
return arr;
}
You can operate on the array pointer passed into your function and modify the input array in place.
void function(int param[][50]) {
/* operate on param[i][j] directly -- destroys input */
}
You can use a parameter as an "output variable" and use that to "return" the new array. This is best if you want the caller to allocate memory or if you want to indicate success or failure:
int output[][50];
int function(int param[][50], int &output[][50]) {
output = malloc(50 * 50 * sizeof int);
/* write into output[i][j] */
return success_or_failure;
}
Or, for the caller to allocate:
int output[50][50];
void function(int param[][50], int output[][50]) {
/* write into output[i][j] */
}
函数无法返回数组。
有几种选择:
struct wraparray { int array[42][42]; };
struct wraparray foobar(void) { struct wraparray ret = {0}; return ret; }
int foobar(int *dst, size_t rows, size_t cols, const int *src) { size_t len = rows * cols; while (len--) { *dst++ = 42 + *src++; } return 0; /* ok */ }
// 例子 int x[42][42]; int y[42][42]; foobar(x[0], 42, 42, y[0]);
int foobar(int *arr, size_t rows, size_t cols) { size_t len = rows * cols; while (len--) *arr++ = 0; return 0; /* ok */ }
struct wrap w;
,那么你应该使用 w.array[i][j]
。如果它声明为 struct wrap *w;
,那么你应该使用 w->array[i][j]
。 - sarnold这里有另一个例子。已经测试并且可行。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void test(char**,unsigned int,unsigned int);
const unsigned int sz_fld = 50 + 1;
const unsigned int sz_ffld = 10;
int main(void) {
char fld[sz_ffld][sz_fld];
for (unsigned char i=0;i<sz_ffld;++i) {
strcpy(fld[i],"");
}
strcpy(fld[0],"one");
strcpy(fld[1],"two");
strcpy(fld[2],"three");
char** pfld = malloc(sz_ffld*sizeof(char*));
for (unsigned int i=0;i<sz_ffld;++i) {
*(pfld+i) = &fld[i][0];
}
test(pfld,sz_ffld,sz_fld);
printf("%s\n",fld[0]);
printf("%s\n",fld[1]);
printf("%s\n",fld[2]);
free(pfld);
return(0);
}
void test(char** fld,unsigned int m,unsigned int n) {
strcpy(*(fld+0),"eleven");
strcpy(*(fld+1),"twelve");
return;
}
char **foo(const char * const * bar, size_t const *bar_len, size_t len0) {
size_t i;
char** arr = malloc(sizeof(char *) * len0);
for (i = 0; i < len0; ++i) {
arr[i] = malloc(bar_len[i]);
memcpy(arr[i], bar[i], bar_len[i]);
}
/* do something with arr */
return arr;
}
在你的代码的其他地方:
char **pp;
size_t *pl;
size_t ppl;
/* Assume pp, pl are valid */
char **pq = foo(pp, pl, ppl);
/* Do something with pq */
/* ... */
/* Cleanup pq */
{
size_t i;
for (i = 0; i < ppl; ++i)
free(pq[i]);
free(pq);
}
因为你是通过指针而不是值传递,且想要写入输入数组,所以你必须先复制它。
void MyFunction(array2d[][20]) { ... }
int[][50] MyFunction(int[][50] array2d) { ... }
- aleph_nullchar my_array[10][8] =
{
{"One"},
{"Two"},
{"One"},
{"One"},
{"One"},
{"One"},
{"One"},
{"One"},
{"Nine"},
{"Ten"},
};
void foo ( char (**ret)[10][8] )
{
*ret = my_array;
}
void main()
{
char (*ret)[10][8];
foo(&ret);
printf("%s\r\n", (*ret)[0] )
printf("%s\r\n", (*ret)[9] )
}
char my_array[10][8];
typedef char ReturnArray[8];
ReturnArray* foo()
{
return my_array;
}