C语言 如何将输入数组的一部分用于函数?

jogvjijk  于 2022-12-02  发布在  其他
关注(0)|答案(5)|浏览(186)

在C语言中,我需要传递一个常量大小的数组给函数,但只使用了该数组的一部分。具体来说,下面的伪代码解释了我的情况:

void my_function(int arr_end,double arr[20]) {
    Create new array arr_new that contains elements 0 to arr_end or arr
    Use arr_new
}

到目前为止,我试图做到以下几点:

void my_function(int arr_end,double arr[20]) {
    double arr_new[arr_end+1];
    int i;
    for(i=0;i<=arr_end;i++){
       arr_new[i] = arr[i];
    }
    // Now I can do what I want with arr_new
}

但我得到的错误:下面是Visual Studio Community 2015中错误的屏幕截图:

我的问题是arr_end不是常数(这意味着在不同的时间我想提取arr的不同部分)。
我怎样才能实现我想要的(使arr_new包含arr的一部分)只使用基本代码,而没有malloc或类似的东西?谢谢!

uelo1irk

uelo1irk1#

首先,在my_function参数中,您声明要接收大小为20的数组(double arr[20]),由于数组不能按值传递,因此将转换为double* arrsee this)而不知道arr具有多少个元素,因此,您应该 * 小心 *,否则会得到 segfault。建议的方法是将double arr[20]更改为double* arr,并为arr的大小添加另一个参数。示例:

void my_function(const size_t arr_end, double* arr, const size_t arr_size) {
    ...
}

其次,您尝试将VLAsMSVC配合使用,而MSVC仅支持C90和我们在C99上添加的VLA,因此您需要使用malloc手动分配内存,并在使用完毕后使用free释放内存。
下面是修复的代码:

void my_function(size_t arr_end, double* arr, size_t arr_size) {
    double* arr_new = NULL;

    // Allocate enough memory to hold the array
    arr_new = malloc((arr_end + 1) * sizeof(double));

    // Copy arr elements to arr_new
    for(int i = 0; i <= arr_end; i++){
       arr_new[i] = arr[i];
    }

    // Now you can do what you want with arr_new

    // When you finished using it.
    free(arr_new);
}
bbmckpt7

bbmckpt72#

在较早的c版本中不允许动态大小数组,因此您可以:
1.更改编译标志以适合您并允许您进行编译,如果您正在使用IDE,则这可能与IDE相关。
1.使用malloc或类似函数动态分配数组,如下所示:

void my_function(int arr_end,double arr[20])
{
    double *arr_new = malloc((arr_end+1) * sizeof(arr[0]));
    int i;
    for(i=0;i<=arr_end;i++){
       // do whatever you need
    }
}

1.在堆栈上分配一个大小为20的数组,只使用其中的一部分(使用for循环),如下所示:

void my_function(int arr_end,double arr[20]) {
    double arr_new[20];
    int i;
    for(i=0;i<=arr_end;i++){
       //do whatever you need
    }
}

如果你必须只发送你需要的部分,方法2是更可取的。

lmyy7pcs

lmyy7pcs3#

据我所知,问题是当你创建动态数组时,唯一的方法是使用malloc来分配空间。然后你把它赋给一个数组,如double arr_new[arr_end+1];arr_end只能是一个显式值,例如12,或3。不是arr_end这样的变量。它应该是double arr_new[5];这样的变量

tyu7yeag

tyu7yeag4#

显然,问题出在VisualStudio上。可变长度数组(VLA)的概念是C99标准的,而VisualStudio似乎只支持C90。
他们似乎有一个解决办法,但是,你可以在这里找到它:https://msdn.microsoft.com/en-us/library/zb1574zs(v=vs.140).aspx

mpbci0fu

mpbci0fu5#

使用动态分配。代码:

void foo(int end, double arr[20]){
    double* newArr = malloc((end + 1) * sizeof(double));
    //now you can use newArr like a normal array
    //Copy like this
    for(int i = 0; i < end; i++){
        newArr[i] = arr[i];
    }
}

相关问题