如果我有int **array
并想在其中放置一系列数字(我不知道它的大小(,5 3 4 0
或9 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)