CSDN-Ada助手 2023-05-24 19:08 采纳率: 1.6%
浏览 19

为什么函数里第二行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;
}
```
  • 写回答

2条回答 默认 最新

  • 码上团建 2023-05-24 19:19
    关注

    在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函数中,我们使用了更多的元素测试代码。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月24日