如何仅将一部分输入数组用于函数?

时间:2016-07-24 11:36:15

标签: c arrays memory dynamic

我需要将一个恒定大小的数组传递给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
}

但我收到错误:int arr_end expression must have a constant value 。以下是Visual Studio社区2015中错误的屏幕截图: enter image description here

我的问题是arr_end不是常数(这意味着我想在不同的时间提取arr的不同部分。)

如何才能实现我想要的功能(make arr_new包含arr的一部分)仅用于基本代码且没有malloc或类似的内容?谢谢!

5 个答案:

答案 0 :(得分:1)

旧c版本中不允许使用动态大小数组,因此您可以:

  1. 更改编译标记以适合您并允许您编译,如果您使用的是IDE,则可以依赖于IDE。

  2. 使用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 } }

  3. 在堆栈上分配一个大小为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 } }

  4. 如果您必须仅发送您需要的部分,则最好使用方法2.

答案 1 :(得分:1)

首先在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一起使用,C90只支持C99和我们在{{3}}添加的VLA,因此您需要手动分配内存{ {1}}并在使用完毕后将其与malloc一起免费使用。

现在这里是修复的代码:

free

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用动态分配。代码:

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];
    }
}

答案 4 :(得分:0)

显然,问题在于Visual Studio。可变长度数组(VLAs)的概念属于C99标准,而Visual Studio似乎只支持C90。

他们似乎有一个解决方法,但是,你可以在这里找到它:https://msdn.microsoft.com/en-us/library/zb1574zs(v=vs.140).aspx