在C语言中无法根据字符数组的长度分配数组。

3

在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将内容写入该缓冲区。 - Cheatah
根据我的经验,将使用变长数组的代码重写以使其与MSVC兼容的最简单方法是使用函数_alloca。这样,内存将自动释放。 - Andreas Wenzel
2个回答

4

tmp_name是一个变长数组,在MSVC中不支持这样的数组。

如果你希望在MSVC下工作,需要动态分配空间。

此外,你的数组长度并不足以存放合并后的字符串及其结尾的null字节。


1

由于tmp_size是一个变量而不是固定值,因此您需要使用malloc动态分配内存,当您完成后,您可以使用free释放内存。

注意:您必须包含stdlib头文件才能访问malloc和free函数。

#include <stdlib.h>
#include <string.h>

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;
}

使用数组后的内存释放*

free(tmp_name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接