在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
或类似的东西?谢谢!
5条答案
按热度按时间uelo1irk1#
首先,在
my_function
参数中,您声明要接收大小为20的数组(double arr[20]
),由于数组不能按值传递,因此将转换为double* arr
(see this)而不知道arr
具有多少个元素,因此,您应该 * 小心 *,否则会得到 segfault。建议的方法是将double arr[20]
更改为double* arr
,并为arr
的大小添加另一个参数。示例:其次,您尝试将VLAs与MSVC配合使用,而MSVC仅支持C90和我们在C99上添加的VLA,因此您需要使用
malloc
手动分配内存,并在使用完毕后使用free
释放内存。下面是修复的代码:
bbmckpt72#
在较早的c版本中不允许动态大小数组,因此您可以:
1.更改编译标志以适合您并允许您进行编译,如果您正在使用IDE,则这可能与IDE相关。
1.使用malloc或类似函数动态分配数组,如下所示:
1.在堆栈上分配一个大小为20的数组,只使用其中的一部分(使用for循环),如下所示:
如果你必须只发送你需要的部分,方法2是更可取的。
lmyy7pcs3#
据我所知,问题是当你创建动态数组时,唯一的方法是使用
malloc
来分配空间。然后你把它赋给一个数组,如double arr_new[arr_end+1];
。arr_end
只能是一个显式值,例如1
,2
,或3
。不是arr_end
这样的变量。它应该是double arr_new[5];
这样的变量tyu7yeag4#
显然,问题出在VisualStudio上。可变长度数组(VLA)的概念是C99标准的,而VisualStudio似乎只支持C90。
他们似乎有一个解决办法,但是,你可以在这里找到它:https://msdn.microsoft.com/en-us/library/zb1574zs(v=vs.140).aspx
mpbci0fu5#
使用动态分配。代码: