You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2022报错C2133:用unsigned变量做数组长度提示未知大小

C2133报错原因

该错误由Visual Studio 2022自带的MSVC编译器特性导致:

  • MSVC对C语言标准的支持不包含C99引入的变长数组(VLA) 特性,你代码中的char buff[size]就是典型的变长数组用法——数组长度由运行时才能确定值的变量size指定,MSVC要求栈数组的长度必须是编译期就能确定的常量,所以直接抛出C2133错误提示数组大小未知。
  • 这个问题和size是unsigned类型无关,哪怕你把size换成int类型,只要是用变量指定栈数组长度,MSVC都会报同样的错误。
修复方案

方案1:更换编译器

如果可以更换编译环境,使用GCC、Clang等完全支持C99及以上标准的编译器,编译时添加-std=c99参数即可正常编译变长数组写法。

方案2:适配MSVC环境,改用动态内存申请

如果必须使用MSVC编译器,把栈上的变长数组替换为堆内存动态申请,用完后手动释放即可,参考修改后的代码:

#include <stdlib.h>
void mem_move(void* dest, void* src, unsigned size)
{
    char* d = (char*)dest;
    char* s = (char*)src;
    // 堆上申请size字节空间代替变长数组
    char* buff = (char*)malloc(size);
    if (buff == NULL) {
        // 内存申请失败可自行添加异常处理逻辑
        return;
    }
    // 从源地址复制数据到缓存
    for (unsigned i = 0; i < size; i++) {
        buff[i] = s[i];
    }
    // 从缓存复制数据到目标地址
    for (unsigned i = 0; i < size; i++) {
        d[i] = buff[i];
    }
    // 释放申请的堆内存,避免内存泄漏
    free(buff);
}

int main()
{
    char buffer[] = "one two three  ";
    mem_move(buffer + 3, buffer, 10);
    char buffer2[] = "one two three  ";
    mem_move(buffer2, buffer2 + 3, 10);
    return 0;
}
原代码其他逻辑错误

你原有代码中的循环判断逻辑存在严重问题:
while (*b <= size)中的*b是读取buff数组当前位置的存储值,buff刚创建时内部是随机垃圾值,该判断条件和你需要的「复制size个字节」的需求完全不符,会导致数组越界访问,触发未定义行为,建议改为用计数变量控制循环次数。

内容的提问来源于stack exchange,提问作者Pen4o

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:15:01