我们先不讨论下面代码的坏处,它不是我的,我完全 提前同意你的看法,它不是很漂亮,而是 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/