C 如何仅将输入数组的一部分用于函数?
我需要将一个恒定大小的数组传递给C中的函数,但只使用该数组的一部分。具体而言,以下伪代码解释了我的情况:C 如何仅将输入数组的一部分用于函数?,c,arrays,memory,dynamic,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]
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
}
void my_函数(int arr_end,double arr[20]){
双arr_new[arr_end+1];
int i;
对于(i=0;i,据我所知,问题是当您创建动态数组时
唯一的方法是使用malloc
分配空间,然后将其分配给数组
正如在double arr\u new[arr\u end+1];
中一样,arr\u end
只能是一个显式值,例如1
、2
或3
,而不是像arr\u end
这样的变量。它应该是这样的double arr\u new[5];
使用动态分配。代码:
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];
}
}
void foo(int-end,双arr[20]){
double*newArr=malloc((end+1)*sizeof(double));
//现在可以像普通数组一样使用newArr了
//像这样复制
for(int i=0;i
旧的c版本中不允许使用动态大小数组,因此您可以:
void my_函数(int arr_end,double arr[20])
{
double*arr_new=malloc((arr_end+1)*sizeof(arr[0]);
int i;
对于(i=0;i显然,问题在于Visual Studio。可变长度数组(VLA)的概念是C99标准,而Visual Studio似乎只支持C90
它们似乎有一个解决方法,但是,您可以在这里找到:首先在my\u函数中
参数中,您声明您正在接收一个大小为20的数组(double arr[20]
),因为数组不能按值传递,它会转换为double*arr
()在不知道arr
有多少个元素的情况下,您应该小心,否则会出现segfault。建议将double arr[20]
更改为double*arr
,并为arr
的大小添加另一个参数。示例:
void my_function(const size_t arr_end, double* arr, const size_t arr_size) {
...
}
其次,您尝试使用仅支持和我们添加的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);
}
void my_函数(size_t arr_end,double*arr,size_t arr_size){
double*arr_new=NULL;
//分配足够的内存以容纳阵列
arr_new=malloc((arr_end+1)*sizeof(double));
//将arr元素复制到arr_new
对于(int i=0;你确定这段代码会引发错误吗?我认为这与数据类型存在冲突,双arr_new和int arr_end你使用的是C99兼容的编译器吗?啊,是的,所以不支持VLA。只需将VLA替换为malloc
和free
。查找如何执行此操作,然后在出现错误时发布新代码合并。好吧,你可以声明另一个固定大小的数组(看起来最大值是20),并且只使用arr\u end
元素……这对于旧版本的C(以及所有版本的C++)来说都是如此。但是OP可以在新版本下编译,并获得使用这种可变长度数组的能力。请参阅OP的注释。@下划线\u d@DownvoterC的“在新版本下编译”,即使用一个支持这样的编译器。MS不支持的是一个很长的列表,这对我来说完全没有意思。但我指的是你对OP的评论,这有助于说明这一点。(好名字,顺便说一下)@下划线\d你怎么知道OP可以“在新版本下编译”“我必须完全按照字面意思来表达每件事,并且对每个人的字面情况都有深入的了解吗?”显然,“可以”这意味着如果在逻辑上可能的话,该语言可以做些什么。你还有什么其他的吗?让我们试着一次消除所有迂腐的行为。对于你的第三个解决方案,如何只使用数组的一部分?我需要将它作为一个整体传递给另一个不是我的函数,那么我如何只将数组的一部分传递给该函数?在堆上分配一个大小为20的数组
你的意思是在堆栈上,对吗?如果大小已知,那么将其放在堆上是没有意义的(在这种特定情况下,考虑到它不够大,不足以粉碎OP的堆栈,只适合那里的学究)@space_voyager该函数的特征是什么?或者更好,你对它意味着什么“我需要把它作为一个整体传递”@Bob_uuu我的意思是我需要做一些类似于另一个函数(arr_new)的事情
其中另一个函数是另一个函数。我不关心arr\u new
,我只需要将arr
的特定部分传递给另一个函数
@space\u voyager你知道数组作为参数传递给函数时会衰减为指针吗?所以,通常,你必须传递arr的大小为避免越界访问,除非大小为全局常量。该页面没有任何意义。“以下是如何使用VLA[…]VLA当前不受支持。"到底是哪一个?它下面的代码部分,即#pragma行。真的帮不上忙。责怪MS不支持更新的标准。是的,我确实读了整件事,但它仍然没有意义。它首先说不支持VLA,然后声明一个,然后才用它做一些线程相关的事情,这似乎是正交的。All我发现的关于这个的其他问题意味着它无法实现。因此,如果你发现了其他问题,那么值得扩展你的答案来解释为什么这个解决方法有效。目前,他们的例子看起来不相关。我同意,这没有任何意义。这更像是一种黑客行为来掩盖缺乏支持。也许你可以切换到GCC来解决这个问题