鱼C论坛

 找回密码
 立即注册
查看: 3628|回复: 3

链表节点数据输出问题

[复制链接]
发表于 2015-5-28 12:10:59 | 显示全部楼层 |阅读模式
5鱼币
#include <iostream>
using namespace std;

struct Node
{
       int data;
       Node *next;
};

bool LinkList(Node *L);
void main()
{
        Node *L;
        L=NULL;
        LinkList(L);
        cout<<"hello"<<endl;
        cout<<L->data;
        cout<<L->next;
        free(L);
        L=NULL;
}


bool LinkList(Node *L)
{
        L=(Node *) malloc (sizeof (Node ));
        if(L== NULL)
        {
                cout<<"error"<<endl;
                return false;
        }
        else
        {
                cout<<"ok"<<endl;
                L->data=0;
                L->next=NULL;
                return true;
        }
};


想输出节点的数据和下一节点的地址。

最佳答案

查看完整内容

楼主, 动态传递内存(如函数内部完成申请, 传递给外面) 要么传递二级指针, 要么传递一级指针的引用 编译器默认会为每个参数拷贝一个形参, 指针也不例外 所以作为副本的临时变量在函数内部确实得到了申请的内存 但是随着函数的结束这个局部变量也就销毁了造成了1. 内存泄露 2. 外面的变量并没有真正的得到申请的内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-28 12:11:00 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-5-28 12:51 编辑
  1. struct Node
  2. {
  3.         int data;
  4.         Node *next;
  5. };

  6. bool LinkList(Node** L);
  7. void main()
  8. {
  9.         Node *L;
  10.         L=NULL;
  11.         LinkList(&L);
  12.         cout<<"hello"<<endl;
  13.         cout<<L->data;
  14.         cout<<L->next;
  15.         free(L);
  16.         L=NULL;
  17. }


  18. bool LinkList(Node** L)
  19. {
  20.         *L=(Node *) malloc (sizeof (Node ));
  21.         if(L== NULL)
  22.         {
  23.                 cout<<"error"<<endl;
  24.                 return false;
  25.         }
  26.         else
  27.         {
  28.                 cout<<"ok"<<endl;
  29.                 (*L)->data=0;
  30.                 (*L)->next=NULL;
  31.                 return true;
  32.         }
  33. };
复制代码

楼主, 动态传递内存(如函数内部完成申请, 传递给外面)
要么传递二级指针, 要么传递一级指针的引用
编译器默认会为每个参数拷贝一个形参, 指针也不例外
所以作为副本的临时变量在函数内部确实得到了申请的内存
但是随着函数的结束这个局部变量也就销毁了造成了1. 内存泄露 2. 外面的变量并没有真正的得到申请的内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-5-28 13:16:22 | 显示全部楼层
ryxcaixia 发表于 2015-5-28 12:48
楼主, 动态传递内存(如函数内部完成申请, 传递给外面)
要么传递二级指针, 要么传递一级指针的引用
编译 ...

谢谢,又懂了点,:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-28 13:19:19 | 显示全部楼层
Miracle-s 发表于 2015-5-28 13:16
谢谢,又懂了点,

给你贴一点东西 亲可以参考下
  1. // 形参都是拷贝, 即使指针作为形参也是拷贝一份指针作为副本
  2. // Swap_1在函数内部完成交换, 出了函数则没有完成交换, 原因就是局部变量销毁, 原指针并没有任何动作
  3. // Swap_2则完成了交换, 因为操作的是原始数据, 即直接拿着原始的实参进行指向操作
  4. void Swap_1(int* p1, int* p2)
  5. {
  6.         int* temp = p1;
  7.         p1 = p2;
  8.         p2 = temp;
  9. }

  10. void Swap_2(int** pp1, int** pp2)
  11. {
  12.         int* temp = *pp1;
  13.         *pp1 = *pp2;
  14.         *pp2 = temp;
  15. }
复制代码

第一个函数, 达不到交换的效果, 因为函数内部编译器又申请了两个形参, 函数内部完成了交互, 出了函数就死翘翘了
第二个函数, 达到了交换的效果, 因为传递的是二级指针, 对二级指针的一级解引用就相当于那个拿到了真正的外部的那个指针, 从而可以改变指向
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 19:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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