如果我有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++;
}
这是正确的方法吗?
注意*我知道它不一定是指针的指针,但我需要它以后用于其他东西。
答案 0 :(得分:0)
至少出于这些原因,你的代码是错误的。
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++;
}
OP更新后编辑
如果你真的想使用双指针(即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++;
}
答案 1 :(得分:0)
您在代码中所做的是逐步分配更大的内存区域并将输入值保存在每个新区域的最后位置,同时丢失指向先前分配区域的指针。对于你想要的东西(我认为在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)
UPDATE:如果你真的需要使用** 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)