为什么来自realloc的新地址不会反映在函数之外?

时间:2014-10-24 05:44:16

标签: c realloc

我在这里标记了四个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");     
  }
}

2 个答案:

答案 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替换为reallocint替换为指针类型。

为了在函数中设置变量并使这些变化在函数外部可见,您需要通过引用传递变量,或者返回变量。

答案 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相同。