Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
此代码在最后一行引发分段错误。标头是指向一个连续的内存块的指针,该内存块全为 0,取消引用其余部分返回 0,这可能与问题有关。我仍然觉得这应该可以工作,有什么问题?
void setHeader(void *header, size_t payload) { size_t *remainder = (size_t*)((char *)header + (payload + 4)); *remainder = payload; }
为什么你认为这应该有效?除非指向的对象足够大以至于相加payload + 4不会超过对象的大小,否则指针算术具有未定义的行为。即使定义了算术(例如,如果对象大小正好是payload + 4),取消引用数组末尾之后的插槽也有 UB。您需要确保您要传递其地址的对象足够大,以便您的代码能够正常工作。
payload + 4