我需要将一个恒定大小的数组传递给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中错误的屏幕截图:
我的问题是arr_end
不是常数(这意味着我想在不同的时间提取arr
的不同部分。)
如何才能实现我想要的功能(make arr_new
包含arr
的一部分)仅用于基本代码且没有malloc
或类似的内容?谢谢!
答案 0 :(得分:1)
旧c版本中不允许使用动态大小数组,因此您可以:
更改编译标记以适合您并允许您编译,如果您使用的是IDE,则可以依赖于IDE。
使用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
}
}
在堆栈上分配一个大小为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.
答案 1 :(得分:1)
首先在my_function
参数中声明您正在接收大小为20(double arr[20]
)的数组,因为数组无法按值传递,它会转换为double* arr
(see this)在不知道arr
有多少元素的情况下,您应该小心,否则您将获得 segfault 。建议的方法是将double arr[20]
更改为double* arr
,并为arr
的大小添加另一个参数。例如:
void my_function(const size_t arr_end, double* arr, const size_t arr_size) {
...
}
其次,您尝试将VLAs与MSVC一起使用,C90只支持C99和我们在{{3}}添加的VLA,因此您需要手动分配内存{ {1}}并在使用完毕后将其与malloc
一起免费使用。
现在这里是修复的代码:
free
答案 2 :(得分:0)
据我所知,问题是当你创建动态数组时
唯一的方法是使用malloc
来分配空间。然后将其分配给数组
与double arr_new[arr_end+1];
中一样。 arr_end
只能是显式值,例如1
,2
或3
,而不是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