我在这里标记了四个printf语句。我的问题是,在完成重新分配发生的函数AddSub时,struct sub * temp包含的地址被认为是分配给struct sub * a,当程序返回到我打印的函数main时,它不会被反映出来struct sub * dstore的地址。
第一,第二和第三个printf语句显示重新分配成功(printf 2显示temp收到一个新地址,print 3显示该地址被分配给a)。但我对于为什么第四张printf显示不同而非常困惑。
struct sub {
char code[8];
float units;
char tag[101];
};
void AddSub(struct sub *a, struct cla *b, int *ctr){
char ecode[8], etags[101];
float eunits;
struct sub *temp = a;
scanf("%s %f %s", ecode, &eunits, etags);
if (!(AlIn(ecode) + UnCh(ecode, a, *ctr)))
{
if(*ctr)
{
printf("Before realloc: %p, %p\n", (void*)a, (void*)temp); /*1st*/
temp = realloc(a, (*ctr + 1) * sizeof(*a));
printf("After realloc: %p, %p\n", (void*)a, (void*)temp); /*2nd*/
}
if(!temp)
{
printf("Insufficient space.\n");
free(a); free(b);
exit(1);
}
else
{
if(*ctr)
{
a = temp;
printf("After AddSub readdress: %p, %p\n", (void*)a, (void*)temp); /*3rd*/
}
strcpy((a + *ctr) -> code, ecode);
(a + *ctr) -> units = eunits;
strcpy((a + *ctr) -> tag, etags);
printf("%s saved. ", (a + *ctr) -> code);
*ctr = *ctr + 1;
}
}
}
int main()
{
char com[14];
int subctr = 0, clactr = 0;
struct sub *dstore;
struct cla *cstore;
if (!(dstore = malloc(sizeof(struct sub))))
exit(1);
if (!(cstore = malloc(sizeof(struct cla))))
{
free(datastore);
exit(1);
}
while(1)
{
printf("INPUT> ");
scanf("%s", com);
if(strcmp(com, "ADD-SUBJECT") == 0)
{
AddSub(dstore, cstore, &subctr);
printf("Finished Addsub: %p\n", dstore); /*4th*/
}
else if (strcmp(com, "EXIT") == 0)
{
printf("Bye!\n");
free(dstore); free(cstore);
return 0;
}
else
printf("What?.\n");
}
}
答案 0 :(得分:0)
C使用pass by value。当你有,例如:
void func(int a)
{
a = 5;
}
int main()
{
int b = 6;
func(b);
printf("%d\n", b);
}
输出为6
。这个小例子基本上是代码中发生的事情,5
替换为realloc
,int
替换为指针类型。
为了在函数中设置变量并使这些变化在函数外部可见,您需要通过引用传递变量,或者返回变量。
答案 1 :(得分:0)
而不是声明
void AddSub(struct sub *a, struct cla *b, int *ctr)
使用
a
并传递
AddSub(dstore, cstore, &subctr);
声明
void AddSub(struct sub **a, struct cla **b, int *ctr)
使用
*a
并传递
AddSub(&dstore, &cstore, &subctr);
与subctr
相同。