【问题标题】:2d dynamic int array in cc中的二维动态int数组
【发布时间】:2018-08-07 06:53:07
【问题描述】:

我想创建一个函数,将给定的二维动态 int 数组增加一行。我看了几个网站、指南、教程,但都不一样,所以我现在很困惑。

二维数组有 2 个固定列。

我的代码在这里:

int length=1;
void arrayinc(int** array, int x0, int x1)
{
    if (array == NULL)
        malloc(array, sizeof(int[2]));
    else
        realloc(array, (++length)*sizeof(int[2]));

    array[length-1][0]=x0;
    array[length-1][1]=x1;

    free(array);
}

int main()
{
    int** array=NULL;
    arrayinc(&array, 1, 2);
    // I will do some stuff after the increase
}

我希望有人可以帮助我,并解释它是如何工作的!

对不起我的英语和糟糕的 malloc/realloc 知识。

【问题讨论】:

  • Correctly allocating multi-dimensional arrays 的副本。对这个话题感到困惑是很正常的,因为那里有很多垃圾书和垃圾老师,教你不好的做法。
  • malloc(array, sizeof(int[2])); 嗯,没有。
  • 调整动态数组大小的原型函数是 realloc。非常仔细地查看它的签名。为什么它有这个签名而不是其他任何签名?为什么它会返回它所做的事情?您自己的函数是否应该彻底偏离 realloc 的工作方式?如果有,为什么?

标签: c arrays multidimensional-array malloc realloc


【解决方案1】:

函数参数是它的局部变量。所以在函数中你处理原始参数的副本。

至少参数应该声明为

int*** array

如果列数是编译时常量,那么函数可以按以下方式定义。

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

#define N   2

size_t arrayinc( int ( **array )[N], size_t n, int x0, int x1)
{
    int ( *tmp )[N] = realloc( *array, ( n + 1 ) * sizeof( int[N] ) );

    if ( tmp )
    {
        *array = tmp;
        ( *array )[n][0] = x0;
        ( *array )[n][1] = x1;
        ++n;
    }

    return n;
}

int main(void) 
{
    int ( *array )[N] = NULL;
    size_t n = 0;

    for ( size_t i = 0; i < 10; i++ )
    {
        n = arrayinc( &array, n, ( int )( 2 * i ), ( int )( 2 * i + 1 ) );
    }

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%d\t%d\n", array[i][0], array[i][1] );
    }

    free( array );

    return 0;
}

程序输出是

0   1
2   3
4   5
6   7
8   9
10  11
12  13
14  15
16  17
18  19

【讨论】:

  • 谢谢!但是我们可以在一个函数中完成这一切吗?而且我还尝试创建一个单独的打印功能,但它显示错误的数字。代码是: void show(int (**array)[2], size_t n) { for (int y = 0; y %2d\n", array[ y][0],数组[y][1]); } }
  • @Gregori 要打印数组,只需声明函数,如 void show( int ( *array )[2], size_t n );并将其称为 show(array, n);
猜你喜欢
  • 2011-01-11
  • 2016-02-13
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2012-05-07
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多