我正在尝试创建一个数组来保存一个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]);
}
}
答案 0 :(得分:8)
你需要在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]);
}
和
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]);
}
现在您正在做的是在开始/添加中修改指针的本地副本,因此当您在这些函数中更改它时,它不会在主
中修改指针n
另外,有趣的是,如果您将NULL
作为realloc
的第一个参数传递给malloc
,那么如果您将n
初始化为NULL
},您只需拨打add
即可,无需先执行begin
。
答案 1 :(得分:0)
检查你的功能添加 - 你确定更新指针值吗? 尝试使用**作为参数 - 我认为这会有所帮助。