| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2153 人关注过本帖
标题:指针的一些问题
只看楼主 加入收藏
来自新世界
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2018-10-17
结帖率:0
收藏
 问题点数:0 回复次数:7 
指针的一些问题
#include<stdio.h>
#include<stdlib.h>
struct test
{
    int data;
    struct test *next;
};
int main()
{
    struct test *p , *q;
    q = p = (struct test*)malloc(sizeof(struct test));
    p->data=3;
    q->next=p;
    q=p;
   
    p = (struct test*)malloc(sizeof(struct test));
    p->data=4;
   
    printf("%d" , q->data);
    return 0;
}
为什么这个打印的是3而不是4
搜索更多相关主题的帖子: 指针 struct test data malloc 
2019-04-29 08:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
总得说个打印3的理由吧
2019-04-29 08:51
来自新世界
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2018-10-17
收藏
得分:0 
回复 楼主 来自新世界
编译器打印出来的就是3啊
2019-04-29 09:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 3楼 来自新世界
是我说错了
改“总得说个打印4的理由吧”
2019-04-29 11:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你根據程序的流程,在腦中動態分析p、q前後分別指向哪裏,就知道爲什麽輸出是3而不是4了。

授人以渔,不授人以鱼。
2019-04-29 16:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你這個代碼問題多多,在編譯器上多處警告,純粹練習分析不妨,實際程序不要這樣寫。

首先看流程,按照代碼的順序從上向下看:

定義了2個指針p和q,然後你向堆内存申請了一塊動態空間(儲存一個test結構的數據),你把這2個指針都指向了這裏,它們指向同一個地方,也就是説,這2個指針是等效的。

申請了空間之後,數據裏面的值是不定的,於是你使用賦值語句給它賦值,不管是使用p還是q,都是一樣的。你給這塊空間的data賦值了3,next指向自己。最後,q=p是多餘的,因爲它們本來就是這樣,屬於重複語句。

然後,你又向堆内存重新申請了一塊test結構的空間,這次把這處内存的地址賦給了指針p。這個動作的後果,即是把原先p、q分離了,q仍然指向第一次的位置,p指向了新的位置,新的位置上data是4。

好了,答案來了,你輸出打印的是q的data值,因爲q指向原先的位置,那裏的data值是3。

問題所在:這個代碼存在内存泄漏問題,向堆内存申請的動態數據沒有主動釋放,雖然現代操作系統都會在程序結束時收回一切内存,這個程序很短小,也沒有其餘函數和動作,所以運行結束一般是沒有問題的,但作爲良好的編碼風格,必須養成自己主動釋放内存的習慣,C/C++最大的隱患就是關於指針涉及的内存泄露和覆蓋、篡改等問題,如果你對指針使用的過程不是自始至終瞭然於胸,就不要貿然使用指針。

這個程序的詳細分析,是告訴你,你的問題在於不知道代碼每一行都在幹什麽,很可能,你不知道malloc()每次是重新請求分配内存的。

[此贴子已经被作者于2019-4-29 16:58编辑过]


授人以渔,不授人以鱼。
2019-04-29 16:57
lihuahao哈
Rank: 2
等 级:论坛游民
威 望:1
帖 子:27
专家分:39
注 册:2018-11-17
收藏
得分:0 
你要学会调试,逐句追踪代码运行的情况,这样就容易知道哪里错了,编译器上有调试功能的

不懂就问,我也想变强!
2019-04-29 17:17
ChengHDong
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2019-5-2
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2019-05-02 20:37
快速回复:指针的一些问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031360 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved