c++ - 邪恶的字节 block 重新解释有效的 C++ 吗?

标签 c++ malloc

我们先不讨论下面代码的坏处,它不是我的,我完全 提前同意你的看法,它不是很漂亮,而是 C-ish 并且可能 非常危险:

void * buf = std::malloc(24 + sizeof(int[3]));

char * name = reinterpret_cast<char *>(buf);
std::strcpy(name, "some name");

int * values = reinterpret_cast<int *>(name + 24);
values[0] = 0; values[1] = 13; values[2] = 42;

它的意图很明确;它是一个“字节 block ”,存储两个不同的数组 类型。要访问不在 block 前面的元素,它将 block 解释为 char * 并将指针递增 sizeof(type[len])

然而,我的问题是,它是否合法 C++(11),如“是否保证它 将在每个符合标准的编译器上工作”?我的直觉告诉我不是,但是 g++ 和 clang 似乎没问题 与它。

如果能给我一个标准报价,我将不胜感激;不幸的是,我 自己找不到相关的段落。

最佳答案

这是完全有效的 C++ 代码(虽然不是很好,正如您自己所说)。只要字符串不超过 23 个字符,它甚至不会与严格的别名规则冲突,因为您永远不会通过不同类型的指针访问内存中的相同字节。但是,如果字符串超出固定限制,就会出现未定义的行为,就像任何其他越界错误一样。

不过,我还是建议至少使用一个结构:

typedef struct whatever {
    char name[24];
    int [3];
} whatever;

whatever* myData = new myData;
std::strcpy(myData->name, "some name");
myData->values[0] = 0; myData->values[1] = 13; myData->values[2] = 42;

这与您提供的代码 100% 相同,只是 new 运算符的开销比直接调用 malloc() 多一些。如果您担心性能,您仍然可以做 whatever* myData = (whatever*)std::malloc(sizeof(*myData)); 而不是使用 new。

关于c++ - 邪恶的字节 block 重新解释有效的 C++ 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19297474/

相关文章:

c++ - 使用 boost 库检查 CRC 没有给出令人满意的结果

c - 从数据结构中释放内存

c - 如何在 C 中使用 malloc() 创建特定大小的数组?

c++ - 避免 3x3 网格 C++ 的数字重复

c++ - 将 std::tuple<T...> 转换为 T

c - C 中的 free() 函数对我不起作用

c - 最初分配 0 个元素,稍后重新分配并测量大小

c++ - 将 new 用于 char* 数组的正确语法

c++ - 分布式缓存代理服务器的想法

c++ - std vector 插入和删除问题