整型数组的Realloc

整型数组的Realloc,c,segmentation-fault,malloc,realloc,C,Segmentation Fault,Malloc,Realloc,我试图创建一个数组来保存一个int,然后当要添加另一个int时,增加它的大小来保存另一个int。。等等 我知道这不是realloc的有效使用,但它比其他任何东西更能证明概念。只要让它工作起来,我就可以对它进行优化,并将它应用到有用的东西上。一个有效的例子。当我调用print函数时,问题就出现了,它只会出现故障。任何帮助都将不胜感激 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #incl

我试图创建一个数组来保存一个int,然后当要添加另一个int时,增加它的大小来保存另一个int。。等等

我知道这不是realloc的有效使用,但它比其他任何东西更能证明概念。只要让它工作起来,我就可以对它进行优化,并将它应用到有用的东西上。一个有效的例子。当我调用print函数时,问题就出现了,它只会出现故障。任何帮助都将不胜感激

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef char String[100];

void begin(int *);
void add(int *, int);
void print(int *);

int tempcount=0;

int main(void)
{
    int *n=NULL;
    String menu;

    begin(n);

    while(true)
    {
        scanf("%9s", menu);

        if(!strcmp("a", menu)) //add
        {
            int i=0;
            scanf("%d", &i);
            add(n, i);
        }
        else if(!strcmp("p", menu)) //print
        {
            print(n);
        }
        else if(!strcmp("q", menu)) //quit
        {
            free(n);
            break;
        }

    }

    return 0;
}

void begin(int *n)
{
    n=malloc(sizeof(int));

    if(n==NULL)
    {
        printf("Error in malloc!");
        return;
    }

    n[0]=0;

    printf("Added %d \n", n[0]);
}

void add(int *n, int numToAdd)
{
    static int sizeCount=0;
    sizeCount++;
    tempcount=sizeCount;

    int *temp;

    temp=realloc(n, (sizeCount+1) * sizeof(int));

    if(temp==NULL)
    {
        printf("Error in realloc!");
        return;
    }

    n=temp;

    n[sizeCount]=numToAdd;

    printf("Added %d \n", n[sizeCount]);

}

void print(int *n)
{
    int i;
    for(i=0; i<tempcount; i++)
    {
        printf("%d ", n[i]);
    }
}
#包括
#包括
#包括
#包括
typedef字符字符串[100];
无效开始(int*);
无效添加(int*,int);
空白打印(整数*);
int tempcount=0;
内部主(空)
{
int*n=NULL;
字符串菜单;
开始(n);
while(true)
{
scanf(“%9s”,菜单);
如果(!strcmp(“a”,菜单))//添加
{
int i=0;
scanf(“%d”、&i);
加(n,i);
}
否则如果(!strcmp(“p”,菜单))//打印
{
打印(n);
}
否则如果(!strcmp(“q”,菜单))//退出
{
自由(n);
打破
}
}
返回0;
}
无效开始(int*n)
{
n=malloc(sizeof(int));
如果(n==NULL)
{
printf(“malloc中的错误!”);
返回;
}
n[0]=0;
printf(“添加了%d\n”,n[0]);
}
无效添加(int*n,int numload)
{
静态int-sizeCount=0;
sizeCount++;
tempcount=sizeCount;
内部*温度;
temp=realloc(n,(sizeCount+1)*sizeof(int));
if(temp==NULL)
{
printf(“realloc中的错误!”);
返回;
}
n=温度;
n[sizeCount]=numLoadd;
printf(“添加了%d\n”,n[sizeCount]);
}
无效打印(int*n)
{
int i;

对于(i=0;i,您需要在add/begin中传递指向指针的指针,以便它们可以在main中修改指针

begin(&n);
...
add(&n, i);
你的定义是什么

void begin(int **n)
{
    *n=malloc(sizeof(int));

    if(*n==NULL)
    {
        printf("Error in malloc!");
        return;
    }

    (*n)[0]=0;

    printf("Added %d \n", (*n)[0]);
}

现在您要做的是在begin/add中修改指针的本地副本,因此当您在这些函数中更改它时,它不会在main中修改指针
n


另外,有趣的是,如果您将
NULL
作为第一个参数传递给
realloc
,它就像
malloc
,因此如果您将
n
初始化为
NULL
,您只需调用
add
,而无需首先执行
begin
检查您的函数add-您确定要更新指针值吗?
尝试使用**作为参数-我认为它会有所帮助。

为什么您认为
realloc
返回指针?因为它返回指针?这是相关的,因此很有趣:@n.m.:
realloc
返回指针,因为它不能保证“调整大小”内存块将与旧内存块位于同一位置。如果必须移动内存块,它需要某种方式来告诉您新内存块在哪里。@n.m.下次问“您认为原因是什么…”为了避免误解。同样,通过引用传递数组,也必须对
添加
函数执行同样的操作。@hexist:嘿,非常感谢你的回答,它真的很有帮助,我让程序运行起来了!谢谢!
void add(int **n, int numToAdd)
{
    static int sizeCount=0;
    sizeCount++;
    tempcount=sizeCount;

    int *temp;

    temp=realloc(*n, (sizeCount+1) * sizeof(int));

    if(temp==NULL)
    {
        printf("Error in realloc!");
        return;
    }

    *n=temp;

    (*n)[sizeCount]=numToAdd;

    printf("Added %d \n", (*n)[sizeCount]);

}