“节目接收信号SIGABRT,已中止” - 为什么?

时间:2013-02-13 22:10:46

标签: c

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

  检测到***堆栈粉碎***:
  程序收到信号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;")。

感谢。

2 个答案:

答案 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);