小编典典

使用 C 返回一个数组

all

我对 C 比较陌生,我需要一些处理数组的方法的帮助。来自Java编程,我习惯于能够说int [] method()以返回一个数组。但是,我发现使用 C
语言时,您必须在返回数组时使用指针。作为一个新程序员,我真的一点也不明白,即使我浏览过很多论坛。

基本上,我正在尝试编写一个在 C 中返回 char 数组的方法。我将为该方法(我们称之为
returnArray)提供一个数组。它将从前一个数组创建一个新数组并返回一个指向它的指针。我只需要一些帮助来了解如何开始以及如何在指针被发送出数组后读取指针。任何解释这一点的帮助表示赞赏。

数组返回函数的建议代码格式

char *returnArray(char array []){
 char returned [10];
 //methods to pull values from array, interpret them, and then create new array
 return &(returned[0]); //is this correct?
}

函数调用者

int main(){
 int i=0;
 char array []={1,0,0,0,0,1,1};
 char arrayCount=0;
 char* returnedArray = returnArray(&arrayCount); ///is this correct?
 for (i=0; i<10;i++)
  printf(%d, ",", returnedArray[i]);  //is this correctly formatted?
}

我尚未对此进行测试,因为我的 C 编译器目前无法正常工作,但我想弄清楚这一点


阅读 66

收藏
2022-07-16

共1个答案

小编典典

您不能从 C 中的函数返回数组。您也不能(不应该)这样做:

char *returnArray(char array []){
 char returned [10];
 //methods to pull values from array, interpret them, and then create new array
 return &(returned[0]); //is this correct?
}

returned是使用自动存储持续时间创建的,一旦离开其声明范围,即函数返回时,对它的引用将变得无效。

您将需要在函数内部动态分配内存或填充调用者提供的预分配缓冲区。

选项1:

动态分配函数内部的内存(调用者负责释放ret

char *foo(int count) {
    char *ret = malloc(count);
    if(!ret)
        return NULL;

    for(int i = 0; i < count; ++i) 
        ret[i] = i;

    return ret;
}

像这样称呼它:

int main() {
    char *p = foo(10);
    if(p) {
        // do stuff with p
        free(p);
    }

    return 0;
}

选项 2:

填充调用者提供的预分配缓冲区(调用者分配buf并传递给函数)

void foo(char *buf, int count) {
    for(int i = 0; i < count; ++i)
        buf[i] = i;
}

并这样称呼它:

int main() {
    char arr[10] = {0};
    foo(arr, 10);
    // No need to deallocate because we allocated 
    // arr with automatic storage duration.
    // If we had dynamically allocated it
    // (i.e. malloc or some variant) then we 
    // would need to call free(arr)
}
2022-07-16