Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C中的函数返回数组_C_Pointers - Fatal编程技术网

从C中的函数返回数组

从C中的函数返回数组,c,pointers,C,Pointers,可能重复: 我是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] = num

可能重复:

我是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);
}
我需要进一步的想法


谢谢。

您的解决方案看起来不错

相反,您甚至不需要本地
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
足够大,以避免数组溢出


输出:

684719851

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

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

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

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

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

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


  • 这实际上不如让用户通过要使用的数组,因为它让用户知道他负责管理所使用内存的生命周期。在本例中,如果忘记释放函数的返回值,则内存泄漏。另外,
    n*sizeof(char)
    是冗余的,因为
    sizeof(char)
    被定义为1。此外,如果你按照他所做的做,从后到前填充数组,并返回指向数组中间的指针,你甚至不能调用
    free
    ,因此你陷入了内存泄漏
    @bchurchill
    ,正如
    塞思·卡内基所说,责任(所有权)除非我在某处记录类似于
    的内容,否则此指针的指针将丢失。注意,使用后应释放从函数返回的指针。。。这是我不喜欢的东西!另一个问题是,分配内存的接收器无法知道数组的长度,除非最后有一个sentinel值。在不传递缓冲区大小的情况下传递指向缓冲区的指针也不是一个好主意。@JimRhodes因此我添加了免责声明。你也可以在长度上通过。但是,如果长度不够大,那么您需要某种错误处理……我尝试使用
    char str[32]调用它;getBase(2,2,str)但是返回无效值,请告诉我为什么?哦,等等,是的,我忘了你跳过前面的空字符。请给我一点时间,用
    memmove()
    @Muhammad来解决这个问题。另外,变量
    i
    未使用,您可以删除它。还有一件事,如果你使用指针而不是索引,你可以避免最后的
    (可能会缩短代码)。我不喜欢
    #1
    中遵循的模式,我更喜欢Objective-c模式。请参阅我对
    bchurchill
    答案的评论。关于
    #2
    我要试试,谢谢。这个问题没有简单的解决办法。(C++中有一些指针可以完成这项工作)。您可以使用您的解决方案(这也很好,也很常见),或者使用我的第二个解决方案(如果大小是恒定的,并且您在编译时就知道)。
    char *arr = malloc(n*sizeof(char));
    
    //now arr points to an array, use it as you like
    
    return arr;