从C中的函数返回数组

时间:2012-01-14 22:45:16

标签: c pointers

  

可能重复:
  Declaring a C function to return an array

我是C新手,需要您的想法帮助我从以下函数返回结果数组:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

  1. 正如其他提到的,常见的解决方案是分配一个数组,返回一个指向它的指针。请确保在调用者函数中释放它。

  2. 如果您知道(在编译时)数组的大小,您可以创建一个包含数组的结构,并返回结构。请注意,它会将数组推送到堆栈,并可能使程序变慢。如果它是一个非常大的数组,你甚至可能会出现堆栈溢出。

答案 2 :(得分:0)

如果要返回长度为n的数组,首先应使用malloc创建数组,然后返回指针。 E.g。

char *arr = malloc(n*sizeof(char));

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

return arr;

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