此代码在最后一行引发分段错误。标头是指向全为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。您需要确保要传递其地址的对象足够大,以便代码可以正常工作。

关于c - 尝试设置解引用指针时出现段错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11918360/

10-11 18:11