邪恶的字节块重新解释是否有效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; 它的意图很明确;它是一个“字节块”,存储两个不同的数组 然而,我的问题是,它是合法的C(11),因为“它是否保证它 我很感激这个标准的引用;不幸的是,我 解决方法
这是完全有效的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));而不是使用新的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |