【问题标题】:wrong output when assigning a number to a struct pointer [duplicate]将数字分配给结构指针时输出错误[重复]
【发布时间】:2021-02-03 08:29:58
【问题描述】:

我的结构是

typedef struct {
unsigned int size ;
int * arr ;
} array_t ;

该函数应该使用给定数字的长度初始化一个结构。

void init ( array_t * A, unsigned int size){
  A = malloc(sizeof(array_t));
  A->arr = calloc(size+1,sizeof(int));
  A->size = size;
  return;
}

但是当我在我的主函数中打印结构的大小时,我总是得到错误的数字。 如何为 size 分配正确的值或我做错了什么?

【问题讨论】:

  • 您无法打印main中分配的内存的内容,因为您根本无法访问它。您分配给函数内参数的内容保留在该函数中。您只需更改第一个参数的副本。

标签: c pointers struct


【解决方案1】:

正如@Robert 所说,一旦你

...
A = malloc(sizeof(array_t));
...

您为A 分配了一个新地址,因此之后完成的所有初始化都在一个您在主函数中无权访问的内存地址上完成。

您实际上不需要这一行,您将一个指向已分配内存的指针传递给init 函数。 放下这条线就可以了。

【讨论】:

  • 这可能不是真的。该函数的目的似乎是分配内存。因此,假设指针指向现有对象是不安全的。恕我直言,更有可能传递的指针不指向对象。
  • 给函数的指针包含一个内存地址。您不能在指针指向的同一内存地址中分配内存。如果没有分配该空间,您将无能为力。
  • 您可以将参数更改为指向现有副本的答案中提到的指针的指针。或者您可以通过return返回新地址。
【解决方案2】:

您的代码不正确,因为它没有返回对新分配内存的引用:

void init ( array_t * A, unsigned int size){
  A = malloc(sizeof(array_t)); // <===== the allocated memory reference is lost
  A->arr = calloc(size+1,sizeof(int));
  A->size = size;
  return;
}

修复它的一种方法是将新的array 返回给调用者:

array_t * CreateArray (unsigned int size){
  array_t * A = malloc(sizeof(array_t));
  A->arr = calloc(size+1,sizeof(int));
  A->size = size;
  return A; /* return the new array */
}

另一种方法是使用指针,但调用者需要执行malloc

void init ( array_t * A, unsigned int size){
  A->arr = calloc(size+1,sizeof(int));
  A->size = size;
}

void main ()
{
  array_t Array;

  init(&Array);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多