加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

邪恶的字节块重新解释是否有效C?

发布时间:2020-12-16 05:06:42 所属栏目:百科 来源:网络整理
导读:我们不要讨论以下代码的不良之处,它不是我的,而是我完全的 事先同意你的意思是它不漂亮,而不是C-ish和潜在的 非常危险: void * buf = std::malloc(24 + sizeof(int[3]));char * name = reinterpret_castchar *(buf);std::strcpy(name,"some name");int * va
我们不要讨论以下代码的不良之处,它不是我的,而是我完全的
事先同意你的意思是它不漂亮,而不是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;

它的意图很明确;它是一个“字节块”,存储两个不同的数组
类型.要访问不在块前面的元素,它会将块解释为
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;

这与您给出的代码完全等效,除了新运算符中的更多开销,而不是直接调用malloc().如果你担心性能,你仍然可以做任何事情* myData =(无论*)std :: malloc(sizeof(* myData));而不是使用新的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读