0

请帮助我理解 - 为什么我会收到此运行时错误:

*** 检测到堆栈粉碎***:
程序收到信号 SIGABRT,已中止。

对于以下代码:

#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;
}

PS:错误发生在运行结束时(在线"return 0;")。

谢谢。

4

2 回答 2

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 [或更低的数字]。

于 2013-02-13T22:52:37.370 回答
0

愚蠢的错误..

我超出了缓冲区的大小:

alignedSize [= buffer size] = 36
bytes allocated for buffer:   0-35

我正在更改 (buffer+36) = buffer[36]这超出了缓冲区的内存限制。

固定代码:

SetVal(_buffer + alignedSize - WORD_SIZE, END_VAL); 
于 2013-02-13T22:19:24.490 回答