| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 876 人关注过本帖, 1 人收藏
标题:一个单链表和二级指针的问题
只看楼主 加入收藏
甜脆的故事
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2013-3-20
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:6 
一个单链表和二级指针的问题
蛋疼了 在百度贴吧没有人理我 现在我来这里求救了  绝非伸手党
程序代码:
void ListInitiate(SLNode **head)
{
if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)
exit(1);
(*head)->next=NULL;
}
这个是一个头文件里面的函数 下面那个是我写的测试程序
#include <stdio.h>
int main(void)
{
int **p,x=4;
*p=&x;//为什么 上面的函数能用*head 接受一个地址 为什么我的*p就不能接受地址呢?我写的程序可以编译 但是运行不了
printf("x=%d,*p=%x",x,*p);
return 0;
}
希望得到大家的帮助 如果可以的话 给我一个学习编程的qq群
搜索更多相关主题的帖子: head 百度贴吧 
2013-03-20 22:09
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:7 
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int **p, x = 4;
    p = (int **)malloc(sizeof(int *));
    printf("x=%d,*p=%x",x,*p);
    free(p);
    return 0;
}

所谓二级指针,可以理解为指向指针A的指针B,你把 A指向某个常量,但是 B没有空间存放 A的地址,所以运行出错


[fly]存在即是合理[/fly]
2013-03-20 23:44
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:7 
上面的是一个函数,实际调用的时候肯定会传入一个合适的实参;
你写的测试例子里面,声明了一个指针的指针,但是没有初始化,所以里面的内容是个无效值;
你访问了一个无效的单元,出错了。
可以改成如下

#include <stdio.h>
int main(void)
{
int x = 4,y=5;
int *px = &x;
int **p = &px;
*p=&y;
printf("x=%d,*p=%x,**p=%d\n",x,*p,**p);
return 0;
}

x=4,*p=bf98c588,**p=5


[ 本帖最后由 pauljames 于 2013-3-21 06:34 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-03-21 06:26
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:7 
二楼正解,你也得给指针开辟空间,最好也得有指向,不然成野指针就会造成内存泄漏。

Maybe
2013-03-21 08:12
甜脆的故事
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2013-3-20
收藏
得分:0 
我先去上课了 放学回来再看 先谢谢大家  
2013-03-21 09:27
甜脆的故事
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2013-3-20
收藏
得分:0 
我好像差不多懂了 我把我的理解贴上来 给大家分享一下
程序代码:
void main(void)
{
    SLNode *head;// SLNode 是书本上之前定义好的结构 我在这里省略了
    int i,x;
    ListInitiate(&head);
    ......// 接下来的程序我省略了
}
//接下来是头文件里面函数的定义
ListInitiate(SLNoder **head)
{
    if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)
        exit(1);
    (*head)->head=NULL;
}
//我之前有一个疑惑 就是为什么函数里面定义了一个**head 后可以直接使用 *head来接收值

//所以我做了如下的测试,自己编写了一个程序,
#include <stdio.h>
int main(void)
{
    int **p,x=4;
    *p=&x;
    printf("x=%d,*p=%x",x,*p);
    return 0;
}
//但是我发现运行到*p=&x 的时候程序就出错了 所以在这里定义了**p 却不能用像上面一样用*p来接收值使我感到困惑
//后来在大家的帮助下我发现了一个问题 ,ListInitiate(SLNoder **head) 在进行函数里面的语句之前 **head 已经得到了一个初值,
//这个初值就是主函数里面的语句  ListInitiate(&head);  给他的,所以他可以直接只用*head 来接收值,然而我定义的**p 没有初始化,所以就不能用*p来接收值
//再一次进行测试 就发现了答案
#include <stdio.h>
int main(void)
{
    int **p,x=4,*q;
    p=&q;
    *p=&x;
   

    printf("x=%d,&x=%x,*p=%x,**p=%d\n",x,&x,*p,**p);
    return 0;
}

2013-03-21 12:47
甜脆的故事
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2013-3-20
收藏
得分:0 
请大家对我的理解提出建议
2013-03-21 12:48
快速回复:一个单链表和二级指针的问题
数据加载中...
 
   



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

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