C 结构体初始化和指针

3
#include <stdio.h>

typedef struct hello{
  int id;
}hello;

void modify(hello *t);

int main(int argc, char const *argv[])
{
  hello t1;
  modify(&t1);
  printf("%d\n", t1.id);
  return 0;
}

void modify(hello *t)
{
  t = (hello*)malloc(sizeof(hello));
  t->id = 100;
}

为什么程序没有输出100?是malloc的问题吗?我不知道如何初始化结构体。

如何仅通过编辑modify函数来获得期望的输出?


1
  1. 在 C 语言中,不要将 malloc 等函数的结果强制转换。
  2. 请自行思考一下:您在函数中将一个值传递给 t,并立即通过 malloc 覆盖它。那么,传递该值有什么用处呢?
- too honest for this site
2个回答

3
void modify(hello *t)
{
  t = (hello*)malloc(sizeof(hello));
  t->id = 100;
}

应该是

void modify(hello *t)
{
  t->id = 100;
}

内存已经静态分配给 h1,你正在创建堆上的内存并写入它。

因此,传递给函数的地址被 malloc() 覆盖了。 malloc() 的返回地址是堆上的某个内存地址,而不是对象 h1 存储的地址。


0

最初指针t指向t1的地址,后来在修改函数中,指针t指向malloc返回的内存。

t->id = 100; 初始化了malloc返回的内存,因此当执行

printf("%d\n", t1.id);

时,您不会看到这个初始化反映在主函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接