Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何仅将输入数组的一部分用于函数?_C_Arrays_Memory_Dynamic - Fatal编程技术网

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]

我需要将一个恒定大小的数组传递给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
}
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版本中不允许使用动态大小数组,因此您可以:

  • 更改编译标志以适合您并允许您进行编译,如果您使用的是IDE,则这可能取决于IDE

  • 使用malloc或类似函数动态分配阵列,如下所示:

    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来解决这个问题