鱼C论坛

 找回密码
 立即注册
查看: 1211|回复: 10

[已解决]P45单链表1中为什么temp不需要malloc分配空间

[复制链接]
发表于 2020-7-2 19:45:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
打扰各位朋友,我在自己打单链表的时候有一个疑惑
  1. void addBook(BOOK** head){

  2.     BOOK* new_book = (BOOK*)malloc(sizeof(BOOK));
  3.     BOOK* temp;
  4.     if (new_book == NULL){
  5.         printf("分配内存失败了!");
  6.         exit(1);

  7.     }
  8.     getInfo(new_book);

  9.     if (*head == NULL){
  10.         *head = new_book;
  11.         new_book->next = NULL;

  12.     }
  13.     else{
  14.         temp = *head;
  15.         *head = new_book;
  16.         new_book->next = temp;


  17.     }

  18.     }
复制代码

以上是我仿照小甲鱼的代码写的添加书本的代码,我不理解的地方是为什么这里的temp不需要分配内存。是因为temp是一个指针,然后它可以随意指向其他有内存的同类型数据吗?我没有给temp分配内存,temp在被定义的时候有自己的地址吗?还是说temp = *head 这句语句之后temp才有了自己的地址——也就是和*head一样的地址呢?
最佳答案
2020-7-2 21:21:58
shatanzongcai 发表于 2020-7-2 20:08
因为我和小甲鱼写的一样,传入的参数,void addBook(BOOK** head),其实是指针地址,所以*head是一个BOOK ...

指针里存的也是数据,只不过你要把它当地址来用。指针自己也有个地址,那只有CPU知道。变量也是的,只有CPU,我们要想知道,只好定义一个指针给它求出来。或者直接&求出来。我们只需写上变量名,CPU知道这个变量在哪。我们一定义变量,就会分配内存。当然是编译后的。这个变量已经确定会出现,程序会预先留出空间存它的值。但是,你使用动态的malloc去申请,那只是一条指令,并没有分配,CPU运行这条指令,才会分配。然而空间没有了,只能在其它地方分一个。所以要申请。也就是说,这是运行中,用户决定要不要出现这个变量,用户要用,它才会分配。这和一开始就有的不同。我们一开始就定义了,有空间它用。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 19:48:48 | 显示全部楼层
因为它不需要存放一个结构体,它只需要指向一个结构体。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-2 20:08:50 | 显示全部楼层
qiuyouzhi 发表于 2020-7-2 19:48
因为它不需要存放一个结构体,它只需要指向一个结构体。

因为我和小甲鱼写的一样,传入的参数,void addBook(BOOK** head),其实是指针地址,所以*head是一个BOOK类型的指针。temp也是一个BOOK类型指针,一个指针赋值给另一个指针是可以的吗?这是不是意味着这两个指针的地址是一样的呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-2 21:21:58 | 显示全部楼层    本楼为最佳答案   
shatanzongcai 发表于 2020-7-2 20:08
因为我和小甲鱼写的一样,传入的参数,void addBook(BOOK** head),其实是指针地址,所以*head是一个BOOK ...

指针里存的也是数据,只不过你要把它当地址来用。指针自己也有个地址,那只有CPU知道。变量也是的,只有CPU,我们要想知道,只好定义一个指针给它求出来。或者直接&求出来。我们只需写上变量名,CPU知道这个变量在哪。我们一定义变量,就会分配内存。当然是编译后的。这个变量已经确定会出现,程序会预先留出空间存它的值。但是,你使用动态的malloc去申请,那只是一条指令,并没有分配,CPU运行这条指令,才会分配。然而空间没有了,只能在其它地方分一个。所以要申请。也就是说,这是运行中,用户决定要不要出现这个变量,用户要用,它才会分配。这和一开始就有的不同。我们一开始就定义了,有空间它用。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-2 22:10:50 | 显示全部楼层
405794672 发表于 2020-7-2 21:21
指针里存的也是数据,只不过你要把它当地址来用。指针自己也有个地址,那只有CPU知道。变量也是的,只有C ...

并不是我们一定义变量就会分配内存的吧?指针变量也是变量呀,但是单纯定义指针应该是不会被分配内存的吧?你的回答我没有太看明白,但是我想知道的是temp = *head的意义是什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-3 07:52:31 | 显示全部楼层
shatanzongcai 发表于 2020-7-2 22:10
并不是我们一定义变量就会分配内存的吧?指针变量也是变量呀,但是单纯定义指针应该是不会被分配内存的吧 ...

会被分配的,因为它是一个指针变量。
temp = *head就是把temp指向head,而不是用temp存储head。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-3 09:09:31 | 显示全部楼层
shatanzongcai 发表于 2020-7-2 22:10
并不是我们一定义变量就会分配内存的吧?指针变量也是变量呀,但是单纯定义指针应该是不会被分配内存的吧 ...

定义必定分配内存,没有内存存它,你上哪儿找它去?指针变量也是变量,也要用内存存它的。给它赋值的话,就把它所在的内存写一个地址进去,这个地址也是用数字记录的。然后根据它去找内存。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 00:12:51 | 显示全部楼层
qiuyouzhi 发表于 2020-7-3 07:52
会被分配的,因为它是一个指针变量。
temp = *head就是把temp指向head,而不是用temp存储head。

把temp指向head是什么意思呢,是说temp也和head一样指向同一个内存地址吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 00:13:22 | 显示全部楼层
405794672 发表于 2020-7-3 09:09
定义必定分配内存,没有内存存它,你上哪儿找它去?指针变量也是变量,也要用内存存它的。给它赋值的话, ...

好的,这一点我明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 08:15:11 | 显示全部楼层
shatanzongcai 发表于 2020-7-5 00:12
把temp指向head是什么意思呢,是说temp也和head一样指向同一个内存地址吗

我想是的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 18:05:32 | 显示全部楼层

好的,感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-6 19:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表