c++ - 如何将可变大小的 char 数组放入结构中?

标签 c++ c arrays struct

我不明白结构的内存重新分配如何允许我将更大的 char 数组插入到我的结构中。

结构定义:

typedef struct props
{
    char northTexture[1];
    char southTexture[1];
    char eastTexture[1];
    char westTexture[1];
    char floorTexture[1];
    char ceilingTexture[1];
} PROPDATA;

例子:

void function SetNorthTexture( PROPDATA* propData, char* northTexture )
{
    if( strlen( northTexture ) != strlen( propData->northTexture ) )
    {
        PROPDATA* propPtr = (PROPDATA*)realloc( propData, sizeof( PROPDATA ) +
            sizeof( northTexture ) );
        if( propPtr != NULL )
        {
            strcpy( propData->northTexture, northTexture );
        } 
    }
    else
    {
        strcpy( propData->northTexture, northTexture );
    }
}

我已经测试过类似的东西并且它似乎有效,我只是不明白它是如何工作的。现在我希望有些人在想“只使用一个 char*”,但我不能出于任何原因。字符串必须存储在结构本身中。

我之所以感到困惑,是因为我没有为任何特定目的调整结构的大小。在该示例中,我并没有以某种方式表明我希望将额外空间分配给 north 纹理字符数组。我想象我分配的额外内存用于实际存储字符串,并且不知何故当我调用 strcpy 时,它意识到没有足够的空间......

如果能解释一下这是如何工作的(或者这是有缺陷的),那就太好了。

最佳答案

这是 C 还是 C++?您发布的代码是 C,但如果它实际上是 C++(如标记所暗示的),则使用 std::string。如果是C,那么有两个选项。

如果(如您所说)您必须将字符串存储在结构本身中,那么您将无法调整它们的大小。 C 结构根本不允许这样做。 “大小为 1 的数组”技巧有时用于将单个可变长度字段固定到结构的末尾,但不能用于其他任何地方,因为每个字段在结构中都有固定的偏移量。您能做的最好的事情就是确定一个最大大小,并使每个数组成为该大小的数组。

否则,将每个字符串存储为 char*,并使用 realloc 调整大小。

关于c++ - 如何将可变大小的 char 数组放入结构中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3123479/

相关文章:

在循环中不断检查共享内存是否发生变化

c++ - 我应该如何以及何时在 cuda API 中使用倾斜指针?

c - 如何在 C 中将十进制 ascii 字符串转换为整数数组?

c++ - 如何正确关闭用 fdopen 打开的套接字?

c - 如何确定同一 iOS 设备上对等 TCP 连接的 PID?

java - 将 ArrayList<double[][]> 转换为 double[][]

c - 关于C中数组名和数组地址

javascript - 为所有值创建 1 个更新按钮

c++ - 检查以确保 argv[1] 是整数 C++

c++ - 为回调函数传递参数