请帮助我理解 - 为什么我会收到此运行时错误:
检测到***堆栈粉碎***:
程序收到信号SIGABRT,Aborted。
代码如下:
#define WORD_SIZE (sizeof(int))
#define FLOOR_MASK 0xfffffffc
static void SetVal(void* _block, int _size)
{
*(int*)_block = _size;
}
void BufferInit(void* _buffer, size_t _totalSize)
{
int alignedSize;
assert(_buffer);
/* align _totalSize to be WORD_SIZE multiple */
alignedSize = _totalSize & FLOOR_MASK;
/* mark end of buffer */
SetVal(_buffer + alignedSize, END_VAL);
}
int main()
{
Byte buffer[36];
BufferInit(buffer, 37);
return 0;
}
P.S:错误发生在运行结束时(在线"return 0;"
)。
感谢。
答案 0 :(得分:3)
SetVal()
函数将4个字节写入您指定为结尾的位置。那就是:
BufferInit(buffer, 37);
... Leads to ...
SetVal(_buffer + alignedSize, END_VAL);
... which does ...
*(int*)_block = _size;
alignedSize
是36(37& ~3 = 36)[~3 = 0xFFFFFFFC]。偏移36处的4个字节写入字节36,37,38和39.由于缓冲区最初为36字节长,因此它位于缓冲区之外。将缓冲区更改为40个字节长,或将37更改为33 [或更低的数字]。
答案 1 :(得分:0)
愚蠢的错误......
我超出了缓冲区的大小:
alignedSize [= buffer size] = 36
bytes allocated for buffer: 0-35
我正在改变(缓冲区+ 36)= 缓冲区[36] ,这超出了缓冲区的内存限制。
固定代码:
SetVal(_buffer + alignedSize - WORD_SIZE, END_VAL);