C - 指针和内存分配的指针



如果我有int **array并想在其中放置一系列数字(我不知道它的大小(,5 3 4 09 1 5 8 3 0为例。据我所知,我应该使用malloc

所以我做了这样的事情

int **array;
int n = 1, inp = 0;
while(n){ // scan till the input is 0
    scanf("%d", &n);
    array = (int**)malloc(sizeof(int*)*(inp+1)); //since inp start at 0
    array[inp] = &n; //is this even correct?
    inp++;
}

我的第一个问题是:这种方法(循环(会升级/扩展array的大小还是我正在做的事情浪费内存?

第二个问题是如何打印/编辑此array的值?

编辑:

从你的回答中,我想出了以下内容。

int **array;
int n = 1, inp = 0;
array = (int**)malloc(sizeof(int*));
while(n){
    scanf("%d", &n);
    realloc( array, sizeof((int*)(inp+1)));
    array[inp] = n;
    inp++;
}

这是正确的方法吗?

注意*我知道它不一定是指针的指针,但我稍后需要它用于其他事情。

至少由于这些原因,您的代码是错误的。

1(你不断做malloc array,从而松开以前malloced块。扩展动态内存的大小时,realloc要使用的函数。

2( 您存储n的地址而不是n的值

除此之外,使用双指针似乎很奇怪。为什么不喜欢:

int *array = NULL;
int n = 1, inp = 0;
while(n){ // scan till the input is 0
    scanf("%d", &n);
    array = realloc(array, sizeof(int)*(inp+1));
    array[inp] = n;
    inp++;
}

操作更新后编辑

如果你真的想使用双指针(即 int **array; (,您需要在两个级别中分配内存。

这可能看起来像:

int **array = malloc(sizeof *array);
*array = NULL;
int n = 1, inp = 0;
while(n){ // scan till the input is 0
    scanf("%d", &n);
    *array = realloc(*array, sizeof(int)*(inp+1));
    (*array)[inp] = n;
    inp++;
}

你在代码中所做的是逐渐分配更大的内存区域,并将输入值保存在每个新区域的最后一个位置,同时丢失指向先前分配区域的指针。对于你想要的东西(我相信在C++的向量中使用(的一个逗号和有效的解决方案是分配一些最小的空间,然后在每次迭代时检查你是否即将超过它。如果是,请重新分配区域,使空间加倍。像这样:

int i = 0; //iterator
int s = 1; //array size
int n;     //input (use do-while so you don't have to worry about initial value)
//it doesn't have to be bidimensional for a single series
int * array = (int *) malloc(sizeof(int) * s);
do
{
    if(i == s)
    {
        s *= 2;
        array = (int *) realloc(array, sizeof(int) * s);
    }
    scanf("%d", &n);
    array[i++] = n; //assign with the value, not with the address
}
while(n)

更新:如果你真的需要使用**int,可以这样做:

int n, i = 0, s = 1;
int ** array = (int **) malloc(sizeof(int*) * s);
do
{
    if(i == s)
    {
        s *= 2;
        array = (int **) realloc(array, sizeof(int *) * s);
    }
    scanf("%d", &n);
    array[i] = (int *) malloc(sizeof(int));
    array[i][0] = n;
    ++i;
}
while(n)

相关内容

  • 没有找到相关文章

最新更新