【问题标题】:How do I copy a 2d array into a temporary 2d array and return it?如何将二维数组复制到临时二维数组中并返回它?
【发布时间】:2016-08-22 12:34:04
【问题描述】:

我正在尝试将一个二维整数数组复制到一个临时二维整数数组并返回它。我在下面试了一下,但我得到了一个非常可疑的 malloc 错误。我尝试用 valgrind 检查它,但找不到任何有用的东西

int **get_grid_state(int **grid, int height, int length) {
    int **grid_state;
    int i;

    grid_state = malloc(height * sizeof(int*));

    for (i = 0; i < height; i++) {
        grid_state[i] = malloc(length);
        memcpy(grid_state[i], grid[i], length);
    }
    return grid_state;
}

Un-settling 错误信息如下:

program: 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.
Aborted

【问题讨论】:

  • 没有没有二维数组,没有东西可以代表一或指向一。如果你想要一个二维数组,使用一个!那么一个简单的memcpy 就足够了。
  • --> for ( i = 0; i &lt; height; i++) { grid_state[i] = malloc(length*sizeof(int)); memcpy(grid_state[i], grid[i], length*sizeof(int)); }
  • @BLUEPIXY - 确实如此。但尚不清楚这是否解释了 OP 的问题(他/她正在分配 length 并复制 length,因此是一致的)。
  • 除非 length
  • @Jean-FrançoisFabre 原因是我很傻,没有分配足够的空间,即。 (length*sizeof(int)) doh, ty 再次。

标签: c memory-management memory-leaks valgrind memcpy


【解决方案1】:

您的方法是正确的,除了内部循环中的大小length:它应该是length * sizeof(int)sizeof(**grid)

        grid_state[i] = malloc(length * sizeof(**grid));
        memcpy(grid_state[i], grid[i], length * sizeof(**grid));

unsettling 错误的原因是子数组分配的太小,您可能在程序的其他部分修改它们,导致malloc 内部数据损坏,在稍后调用其中一个分配函数:malloc()free()calloc()realloc()...

还请注意,您不会检查这些malloc() 调用的返回值。如果由于某种原因malloc 无法分配内存,您将调用未定义的行为而不是优雅地返回NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2013-12-04
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多