我想将数字附加到空数组中,并且这些数字的数量在开始时是未知的。例如,生成从1到10的数字并逐个追加。
generateFromOneToTen
会将我的结果保存在output
中,而count
应该在执行后保存为10。如果我在此功能中打印结果,一切都会好的。
int generateFromOneToTen(int *output, int count)
{
for (int i = 0; i < 10; i++) {
output = arrayAppendInt(output, i + 1, count);
count++;
}
// Print result of `output` is 1,2,3...10 here
return count;
}
我实现了arrayAppendInt
来动态增加数组的长度,并在旧数据后添加新值。
int *arrayAppendInt(int *array, int value, int size)
{
int newSize = size + 1;
int *newArray = (int*) realloc(array, newSize * sizeof(int));
if (newArray == NULL) {
printf("ERROR: unable to realloc memory \n");
return NULL;
}
newArray[size] = value;
return newArray;
}
问题就出现了。调用生成函数时,numbers
将始终为NULL
。如何将生成的数字返回到numbers
变量?
int *numbers = NULL;
int count = 0;
count = generateFromOneToTen(numbers, 0);
^^^^^^^
答案 0 :(得分:3)
您可以使用指向整数(int **
)指针的指针:
int generateFromOneToTen(int **output, int count)
{
for (int i = 0; i < 10; i++) {
*output = arrayAppendInt(*output, i + 1, count);
count++;
}
// `*output` is 1,2,3...10 here
return count;
}
您可以像这样重写arrayAppendInt
函数:
int *arrayAppendInt(int *array, int value, int size)
{
int newSize = size + 1;
int *newArray;
if (array==NULL)
newArray = (int*) malloc ((1+size) * sizeof(int));
else
newArray = (int*) realloc(array, newSize * sizeof(int));
if (newArray == NULL) {
printf("ERROR: unable to realloc memory \n");
return NULL;
}
newArray[size] = value;
return newArray;
}
并称之为*output = arrayAppendInt(*output, i + 1, i);
。
答案 1 :(得分:0)
最简洁的解决方案是(在我看来)将数组+簿记(大小,已使用)打包到结构中,并使用(指针)此结构作为参数。
#include <stdlib.h>
struct dopedarray {
unsigned size;
unsigned used;
int *array;
};
现在您可以将所有分配和bookkkeeping内容放入一个函数中(可以内联):
int array_resize(struct dopedarray *ap, unsigned newsize)
{
int *newp;
if(!ap) return -1;
newp = realloc (ap->array, newsize*sizeof*ap->array);
// check return value here...
if (!newp) return -1;
free(ap->array);
ap->array = newp;
ap->size = newsize;
// bookkeeping sanity
if(ap->size > ap->used ) { ap->used > ap->size; }
return 0;
}
add_element函数也需要稍微更改一下:
int array_add_element(struct dopedarray *ap, int value)
{
if(ap->used >= ap->size){
unsigned newsz;
newsz= ap->used ? 2*ap->used: 4;
array_resize(ap, newsz);
// check return value here...
}
ap->array[ap->used++] = val;
return 0;
}
答案 2 :(得分:0)
我的问题的完整代码:
int generateFromOneToTen(int **output, int count) // +
{
for (int i = 0; i < 10; i++) {
*output = arrayAppendInt(*output, i + 1, count); // ++
count++;
}
return count;
}
int *arrayAppendInt(int *array, int value, int size)
{
int newSize = size + 1;
int *newArray = (int*) realloc(array, newSize * sizeof(int));
if (newArray == NULL) {
printf("ERROR: unable to realloc memory \n");
return NULL;
}
newArray[size] = value;
return newArray;
}
int *numbers = NULL;
int count = 0;
count = generateFromOneToTen(&numbers, 0); // +