C - 某些尺寸的 "sysmalloc: Assertion ..."错误

标签 c memory runtime-error

#include <stdlib.h>
#include <stdio.h>

char* text1 = "This is a string.";
char* text2 = "Yet another thing.";

void copyCodes (int* list, char* text){
  while(*text != 0){
    *list = *text;
    list++;
    text++;
  }
  *(list+sizeof(int)) = 0;
}

int main(void){
  int size = 72; //THIS IS THE ERROR
  int* list1 = malloc(size);
  int* list2 = malloc(size);

  copyCodes(list1, text1);
  copyCodes(list2, text2);

  free(list1);
  free(list2);
}

上面的代码确实有效。
但是,如果我将 size 更改为 72 到 89 (不包括 72 和 89) 之间的任何值,我会得到一个 sysmalloc: Assertion ...错误。

为什么?

注意
我的 Ubuntu (16.04) 机器上出现错误,但它在我的 OSX (10.11.5) 机器上运行良好。

完全错误

malloc.c:2395: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

编辑1
值得注意的是,该代码在用 MIPS 汇编语言编写并为每个数组分配 80 字节内存时有效。 (上面的 C 代码是汇编指令的精确翻译)。

最佳答案

那是因为当您在此处超出分配空间的末尾写入时,您调用了未定义的行为:

*(list+sizeof(int)) = 0;

对于 18 个字符的第二个字符串,list 递增 18 次,假设是 4 字节整数,现在指向分配的 72 字节末尾的 1。然后你做上面的,它写在偏移量 72 + sizeof(int) * sizeof(*list) == 72 + 16.

顺便说一句,“工作正常”只意味着“我很幸运地不知道什么错误正在等待发生”。

关于C - 某些尺寸的 "sysmalloc: Assertion ..."错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39772222/

相关文章:

actionscript-3 - 大小为 -1 的向量会导致 Flash 播放器崩溃且没有错误处理

excel - 运行时错误1004;错误处理

使用舍入到偶数将整数转换为半精度浮点格式

c - 如何修复 C 中的指针错误?

c - 在 C 中添加和排序链表

c++ - 在 memset 为默认值后验证数组的更改

C++空程序内存泄漏

c - C 中的 scanf string 和 printf 不能按预期工作

iOS - 内存泄漏地址簿

android - 使用微调器和编辑文本实现重置按钮时无法获得相同的值