Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中动态增加数组大小(int*)_C_Arrays_Pointers_Int - Fatal编程技术网

在c中动态增加数组大小(int*)

在c中动态增加数组大小(int*),c,arrays,pointers,int,C,Arrays,Pointers,Int,我想在c中向数组动态添加数字。我的想法是只分配一个大小为+1的新数组,添加数字,释放根数组,并将指针从临时数组更改为根数组。像这样: void addNumber(int* a, int* size, int number) { *size = *size + 1; int* temp = (int*)(calloc(*size, sizeof(int))); int i, j = 0; for(i = 0; i < *size-1; i++) {

我想在c中向数组动态添加数字。我的想法是只分配一个大小为+1的新数组,添加数字,释放根数组,并将指针从临时数组更改为根数组。像这样:

void addNumber(int* a, int* size, int number)
{
    *size = *size + 1;
    int* temp = (int*)(calloc(*size, sizeof(int)));
    int i, j = 0;
    for(i = 0; i < *size-1; i++) {
        if(a[i] < number) {
            printf("add ai");
            temp[j] = a[i];
            j++;
        } else {
            printf("add number");
            temp[j] = number;
        }
    }
    if(j != *size) {
        printf("add new number");
        temp[j] = number;
    }
    free(a);
    a = temp;
}

int main(int argc, char* argv[])
{
    int n = 10;
    int* a;
    int size = 1;

    a = (int*) (calloc(1, sizeof(int)));
    a[0] = 1;

    if(!contains(a, size, 2)) {
        addNumber(a, &size, 2);
    }

    printArray(a,size);

    return 0;
}
void addNumber(int*a,int*size,int-number)
{
*大小=*大小+1;
int*temp=(int*)(calloc(*size,sizeof(int));
int i,j=0;
用于(i=0;i<*size-1;i++){
if(a[i]<数字){
printf(“添加ai”);
温度[j]=a[i];
j++;
}否则{
printf(“添加编号”);
温度[j]=数量;
}
}
如果(j!=*尺寸){
printf(“添加新编号”);
温度[j]=数量;
}
免费(a);
a=温度;
}
int main(int argc,char*argv[])
{
int n=10;
int*a;
int size=1;
a=(int*)(calloc(1,sizeof(int));
a[0]=1;
如果(!包含(a,大小,2)){
地址编号(a和尺寸,2);
}
打印阵列(a,大小);
返回0;
}
问题在于addNumber函数中的代码有效,*a具有新数组的正确值。但在主函数中,数组*a的值为1,0。因此,不会添加新插入的值2。为什么?我不知道原因

为什么??我不知道原因

这是因为您正在
addNumber
中本地修改
a
的值。这不会改变
main
a
的值

为了使
main
能够访问新分配的内存,您需要更改
addNumber
以返回新分配的指针

int* addNumber(int* a, int* size, int number){
   ...
   return a;
}
然后将
main
更改为:

if(!contains(a, size, 2)){
    a = addNumber(a, &size, 2);
    // Assign to a the new pointer value.
}

要动态更改数组大小,可以使用例程。除了可以使用eaiser之外,它还可以比依次调用
free()
malloc()
的方法更快

可以保证重新分配的块将填充旧内存块的内容

问题在于addNumber函数中的代码有效,*a具有新数组的正确值

代码中有两个主要缺陷。首先,如果您的
addNumber()
例程不返回新分配的内存块(因此它被泄漏),则应该使用双指针或返回新块作为函数结果

第二个结果来自第一个-在
a
被释放后,您继续对其进行写入

如果您更愿意坚持当前的方法,此修改后的代码应该可以工作:

void addNumber(int** a, int* size, int number)
{
    *size = *size + 1;
    int* temp = (int*)(calloc(*size, sizeof(int)));
    int i, j = 0;
    for(i = 0; i < *size-1; i++) {
        if((*a)[i] < number) {
            printf("add ai");
            temp[j] = (*a)[i];
            j++;
        } else {
            printf("add number");
            temp[j] = number;
        }
    }
    if(j != *size) {
        printf("add new number");
        temp[j] = number;
    }
    free(*a);
    *a = temp;
}

int main(int argc, char* argv[])
{
    int n = 10;
    int* a;
    int size = 1;

    a = (int*) (calloc(1, sizeof(int)));
    a[0] = 1;

    if(!contains(a, size, 2)) {
        addNumber(&a, &size, 2);
    }

    printArray(a,size);

    return 0;
}
void addNumber(int**a,int*size,int number)
{
*大小=*大小+1;
int*temp=(int*)(calloc(*size,sizeof(int));
int i,j=0;
用于(i=0;i<*size-1;i++){
如果((*a)[i]<编号){
printf(“添加ai”);
温度[j]=(*a)[i];
j++;
}否则{
printf(“添加编号”);
温度[j]=数量;
}
}
如果(j!=*尺寸){
printf(“添加新编号”);
温度[j]=数量;
}
免费(*a);
*a=温度;
}
int main(int argc,char*argv[])
{
int n=10;
int*a;
int size=1;
a=(int*)(calloc(1,sizeof(int));
a[0]=1;
如果(!包含(a,大小,2)){
地址编号(&a,&size,2);
}
打印阵列(a,大小);
返回0;
}

main中的“a”已经是指针,将其传递给函数将传递其副本。您需要做的是-传递地址'&a'并在函数中以双指针'**a'的形式接收它,在函数内部,使用解引用来获取数组中的值(如*a[i]和free(*a)。 将最后一行更改为“return temp”,并在main中将其收集为a=addnumber(&a,&size,2)


顺便说一句,与其经历所有这些麻烦,不如使用realloc()函数。它会动态增加数组的大小。使用realloc后,您可以在最后一个索引处添加新的数字。

您要寻找的是。它可以用来增加或缩小内存,同时保留其内容

/* array is now sizeof(int) * new_size bytes */
array = realloc(array, sizeof(int) * new_size);
realloc()
可能会更改现有的内存分配,或者可能会分配一个全新的内存块。这就是为什么将结果重新分配回要重新分配的对象很重要的原因

但是如果
addNumber()
通过创建新内存重新分配数组,
main()
将不知道它。这与此不起作用的原因相同

void incrementNumber(int num) {
    num = num + 1;
}
int num
是一个通过值传递的数字。如果希望它反映在调用方中,则需要将其作为指针传递

void incrementNumber(int *num) {
    *num = *num + 1;
}
指针也是一样。它们仍然是数字。
int*a
按值传递指针。如果在
addNumber
中更改
a
,调用者将看不到它。就像以前一样,您需要将其作为指针传递。这样使用的指向指针的指针称为

(请注意,我还传入了数组中元素的大小,这是无法假定的)

这是通过向数组传递指针来调用的

addNumber(&a, &size, sizeof(int), 5);
在那之后,一切都是一样的

for( int i = 0; i < size; i++ ) {
    printf("%d ", a[i]);
}
puts("");
这是一个很好的练习,你会学到很多关于静态内存的知识,并改掉很多关于静态内存的坏习惯。但是正确有效地执行动态数据结构是很困难的(例如,一次分配一个额外的插槽是非常低效的)


有许许多多的库提供了这样的动态结构。因此,继续将此作为练习,但对于真正的代码,使用诸如。

a=temp;
之类的库是没有用的。
a
是一个局部变量。该赋值不会影响
main()的
a
<代码> > ReLoCu确实是你想做的。为什么不简单地用RealLoc?@ rpgILeSePe来扩展以前分配的内存,如果这只是一个C++问题……RPGILESEPIE,如果OP不熟悉C++(参见)或者这个C++标记的查看器不熟悉C++,那么提供C++解决方案比集中在C上甚至更重要的价值要小得多。
for( int i = 0; i < size; i++ ) {
    printf("%d ", a[i]);
}
puts("");
typedef struct {
    int *array;
    size_t size;
} IntArray;