C语言中如何从函数返回数组

3
我是新手,需要您的帮助来返回以下函数中的结果数组:
``` int* myFunction() { int myArray[3] = {1, 2, 3}; return myArray; } ```
这个问题已经在stackoverflow上有了解答,您可以查看这里
void getBase(int n, int b)
{
    const size_t SIZE = 32;
    char arr[32+1]={0}; int digits=SIZE, i;
    char* ptr = arr;
    while (n > 0)
    {
        int t = n%b;
        n/=b;
        arr[--digits] = numbers[t];
    }
    while ( *ptr == '\0') ptr++;
    // NEED To return a ref to `ptr`
}

我的解决方案:

void getBase(int n, int b, /*send some  array as a parameter*/ char* str)
{
    const size_t SIZE = 32;
    char arr[32+1]={0}; int digits=SIZE, i;
    char* ptr = arr;
    while (n > 0)
    {
        int t = n%b;
        n/=b;
        arr[--digits] = numbers[t];
    }
    while ( *ptr == '\0') ptr++;

    /* and use strcpy ... perhaps memcpy if non-string )*/
    strcpy(str, ptr);
}

我需要更多的想法....
谢谢。
3个回答

4

你的解决方案看起来很好。

实际上,你甚至不需要本地的 arr 数组。你可以直接写入 str 中:

编辑:已经清理并且是可用版本。

const char numbers[] = "0123456789abcdef";

void getBase(int n, int b, char* str)
{
    const size_t SIZE = 32;
    int digits=SIZE;
    while (n > 0)
    {
        int t = n%b;
        n/=b;
        str[--digits] = numbers[t];
    }

    int length = SIZE - digits;

    memmove(str,str + digits,length);
    str[length] = '\0';
}

只需确保您的str足够大,以避免数组溢出。
int main(){

    char str[33];

    getBase(684719851,10,str);

    printf(str);

    return 0;
}

输出:

684719851

3
传递指向缓冲区的指针而不传递缓冲区大小也不是一个好主意。 - Jim Rhodes
@JimRhodes 因此我添加了免责声明。你也可以传入长度。但是如果长度不够大,你就需要某种形式的错误处理... - Mysticial
我尝试使用 char str[32]; getBase(2, 2, str); 进行调用,但返回了无效的值,请问可以告诉我为什么吗? - Muhammad Hewedy
哦等等,是的我忘了你跳过前面的NULL字符。给我一秒钟用memmove()来修复它。 - Mysticial
@Muhammad 另外顺便提一下,变量 i 没有被使用,你可以将其删除。还有一件事,如果你使用指针而不是索引,就可以避免在结尾处使用 while(并且可能缩短代码)。 - Seth Carnegie

1
如其他人提到的,常见解决方案是分配一个数组并返回指针。确保在调用函数中释放它。 如果您知道(在编译时)数组的大小,则可以创建一个包含数组的结构体,并返回该结构体。请注意,它将把数组推入堆栈,并可能使程序变慢。如果这是一个非常大的数组,您甚至可能会遇到堆栈溢出。

我不喜欢#1中所遵循的模式,我更喜欢Objective-C的模式。请查看我对bchurchill答案的评论。至于#2,我会尝试一下,谢谢。 - Muhammad Hewedy
这个问题没有简单的解决方案。(在C++中有一些指针类型可以完成这项工作)。你可以使用自己的解决方案(也很好,很常见),或者使用我的第二个解决方案(如果大小是恒定的,并且在编译时已知)。 - asaelr

0
如果您想返回长度为n的数组,您应该首先使用malloc创建数组,然后可以返回指针。例如:
char *arr = malloc(n*sizeof(char));

//now arr points to an array, use it as you like

return arr;

请确保将函数的返回类型设置为char*。您可以对任何类型的数组执行相同的操作 - 只需确保相应地更新所有类型。


2
这实际上不如让用户传递要使用的数组更可取,因为它让用户知道他负责管理所使用的内存的生命周期。在这个例子中,如果你忘记释放函数的返回值,就会出现内存泄漏。另外,n * sizeof(char)是多余的,因为sizeof(char)被定义为1。此外,如果你像他那样从后往前填充数组并返回指向数组中间的指针,甚至不能调用free,所以你会陷入内存泄漏的困境。 - Seth Carnegie
正如Seth Carnegie所说,除非我在某个地方记录类似于“注意:使用后应该释放函数返回的指针”的内容,否则@bchurchill,这个指针的所有权将会丢失...而这正是我不喜欢的! - Muhammad Hewedy
这个问题的另一个问题是,除非在结尾处有一个哨兵值,否则分配的内存的接收者无法知道数组的长度。 - BillRobertson42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接