为什么函数里第二行int nums[len];会报错_(语言-c语言)

该问题来自社区帖: https://bbs.csdn.net/topics/615513673.为符合问答规范, 该问题经过ChatGPT优化
为什么在函数中定义一个长度为变量len的数组int nums[len]会报错? ```html
#include<stdio.h>
#include<stdbool.h>

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int len = nums1Size + nums2Size;
    int nums[len];
    int i = 0,j = 0,k = 0;
    while(i < nums1Size || j < nums2Size){
        if(nums1[i] < nums2[j]){
            nums[k++] = &nums1[i++];//运行之后k,i+1
            // k++;
        }else{
            nums[k++] = &nums1[j++];//运行之后k,j+1
            // k++;
        }
        if(k <= len/2+1){//到达一半时退出不在写入nums
            break;
        }
    }
    //防止有遗漏
    while(i < nums1Size){
        nums[k++] = nums1[i++];
        // k++;
        if(k <= len/2+1){
            break;
        }
    }
    while(j < nums1Size){
        nums[k++] = nums1[j++];
        // k++;
        if(k <= len/2+1){
            break;
        }
    }
    //判断数组长度奇偶
    double result;
    if(len % 2 == 0){
        result = (nums[len/2-1] + nums[len/2])/2.0;
    }
    else
    {
        result = nums[k];
    }
    printf("%.2f",result);
    
    return result;
}
int main(int argc, char const *argv[])
{
    int nums1[] = {1,2},nums2[] = {3};
    int size1 = sizeof(nums1)/sizeof(int);
    int size2 = sizeof(nums2)/sizeof(int);
    findMedianSortedArrays(nums1,size1,nums2,size2);
    return 0;
}
```

在C中,声明一个数组时,必须在编译时指定其大小,并且数组大小必须是编译时的常量。在您的代码中,您的变量len是运行时的变量,并且不能用于声明一个静态数组。为了避免这个问题,您可以使用指针和动态内存分配的方式创建一个动态数组,以接受两个数组相加后的所有元素。同时,您在数组元素赋值时,使用了错误的指针类型。以下是您的代码的修改版本:

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int len = nums1Size + nums2Size;
    int *nums = (int *)malloc(len * sizeof(int));
    //使用动态内存分配,创建一个动态数组
    //nums是指向int的指针,所以nums[i]代表数组元素
    int i = 0,j = 0,k = 0;
    while(i < nums1Size || j < nums2Size){
        if(nums1[i] < nums2[j]){
            nums[k++] = nums1[i++];//元素赋值,不需要取地址符号
        }else{
            nums[k++] = nums2[j++];
        }
        if(k >= len/2+1){//到达一半时退出不在写入nums
            break;
        }
    }
    //防止有遗漏
    while(i < nums1Size){
        nums[k++] = nums1[i++];
        if(k >= len/2+1){
            break;
        }
    }
    while(j < nums2Size){
        nums[k++] = nums2[j++];
        if(k >= len/2+1){
            break;
        }
    }
    //判断数组长度奇偶
    double result;
    if(len % 2 == 0){
        result = (nums[len/2-1] + nums[len/2])/2.0;
    }
    else{
        result = nums[len/2];
    }
    printf("%.2f",result);
    free(nums); //释放动态分配的内存
    return result;
}
int main(int argc, char const *argv[]){
    int nums1[] = {1,2};
    int nums2[] = {3,4,5};
    int size1 = sizeof(nums1)/sizeof(nums1[0]);
    int size2 = sizeof(nums2)/sizeof(nums2[0]);
    findMedianSortedArrays(nums1,size1,nums2,size2);
    return 0;
}

在修改后的代码中,我们使用了malloc()分配了一个大小为len的动态数组nums,并且在每次循环中,将数组元素赋值给相应的位置。同时,我们在代码最后使用了free()函数释放了动态分配的内存。当然,我们还增加了一些用于递增的循环判断,以防止数组越界,同时在main函数中,我们使用了更多的元素测试代码。

在函数中定义一个长度为变量len的数组int nums[len]会报错,可能是因为C语言中不支持变长数组作为函数参数,也就是说,编译器无法确定数组的大小。解决方法有两种:

  1. 使用动态内存分配函数malloc()来动态创建数组。例如,在您的代码中,可以使用以下代码代替创建变长数组:
int *nums = (int *) malloc(len * sizeof(int));

这将创建一个长度为len的整数数组,并返回指向该数组的指针。请注意,在使用完该数组后,应调用free()释放分配的内存。

  1. 将数组大小作为函数参数传递。例如,在您的代码中,可以将数组大小作为函数参数传递,并将数组定义为固定大小。示例如下:
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size, int len){
    int nums[len];
    // ...
}

int main(int argc, char const *argv[])
{
    int nums1[] = {1,2},nums2[] = {3};
    int size1 = sizeof(nums1)/sizeof(int);
    int size2 = sizeof(nums2)/sizeof(int);
    int len = size1 + size2;
    findMedianSortedArrays(nums1,size1,nums2,size2,len);
    return 0;
}

这将解决变长数组作为函数参数的问题,并保证代码正常运行。