【问题标题】:Unable to allocate array based on char array length in C无法根据 C 中的 char 数组长度分配数组
【发布时间】:2022-11-13 10:53:51
【问题描述】:

在 C 中的一个函数中遇到一些麻烦,该函数基本上是在名称参数的长度 + 扩展长度的帮助下创建和分配一个临时数组。

int my_func(char *name)
{
    char *extension = ".db";
    size_t tmp_size = strlen(name) + strlen(extension);
    char tmp_name[tmp_size];
    
    return 0;
}

然而,这似乎不适用于 MSVC,但在 Clang 或 GCC 上运行良好。知道为什么我会收到这些错误:

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'tmp_name': unknown size

当我在 macOS 上的 Clang 中使用调试器时,我发现它可以正常分配和工作。为什么不用于 MSVC?

【问题讨论】:

  • 只需使用足够大的缓冲区,其大小由MAX_PATHpathconf 确定。使用malloc 分配它。使用snprintf 写入该缓冲区。

标签: c


【解决方案1】:

tmp_name是变长数组,MSVC不支持这种数组。

如果你想让它在 MSVC 下工作,你需要动态分配空间。

此外,您的数组是一个短元素,因为它没有空间用于组合字符串的终止空字节。

【讨论】:

    【解决方案2】:

    由于 tmp_size 是一个变量而不是一个固定值,您将不得不动态分配内存

    int my_func(char *name)
    {
        char *extension = ".db";
        size_t tmp_size = strlen(name) + strlen(extension);
        char *tmp_name;
    
        tmp_name = malloc(sizeof(*tmp_name) * tmp_size + 1 );
        
        
        return 0;
    }
    

    【讨论】:

    • 这恰好分配字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多