C代码在64位Ubuntu 14.04中工作,但在32位Ubuntu 14.04中失败

C代码在64位Ubuntu 14.04中工作,但在32位Ubuntu 14.04中失败,c,pointers,malloc,C,Pointers,Malloc,我不明白为什么。就我而言,它在64位也应该失败,因为我只分配了9个整数大小,但访问了数组的第10个元素。如果是这样,为什么我要关心长度?我可以给出一个随机数作为长度。当您仅为malloc()调用中的9元素分配内存时,但稍后,使用返回的指针,您正在编写 prog: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __built

我不明白为什么。就我而言,它在64位也应该失败,因为我只分配了9个整数大小,但访问了数组的第10个元素。如果是这样,为什么我要关心长度?我可以给出一个随机数作为长度。

当您仅为
malloc()
调用中的
9
元素分配内存时,但稍后,使用返回的指针,您正在编写

prog: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.

for(i=0;i如果在调用未定义的行为时可以确定地预期某个行为,那么它就不会是未定义的。您的问题可以在这里找到:

输出与预期一致

除了由于未分配10项而导致阵列越界访问的核心问题外,您的程序还存在以下问题:

虫子

  • 您从不释放任何内存,并且每次调用函数都会造成内存泄漏。您还应该检查malloc的结果
代码样式/错误做法

  • 避免在C中使用
    new_array()
    函数声明。它意味着“接受任何东西”作为参数。这是C的一个过时功能,可以从语言中删除。相反,请将函数定义为
    int*new_array(void)

  • 不要使用全局变量。
    count
    可以在函数中声明为局部静态变量,或者更好的方法是将其作为参数传递给函数

您可能会从现代的C11编译器中获益。看起来您仍然在编写旧的C90代码

就我而言,它在64位也应该失败,因为我只分配了9个整数大小,但访问了数组的第10个元素

这会导致未定义的行为,这可能意味着立即发生segfault或运行到完成时没有明显的问题,或者破坏程序状态,导致稍后发生故障,等等


这是该语言无法保护您免受自身伤害的众多领域之一。

不要强制执行
malloc()
的返回。看到这一点,您知道您正在泄漏多少内存吗?您希望未定义的行为会被定义!最近看到任何后台进程吗?
prog: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.
for(i = 0; i <= 9; i++)
    array[i] = count++;