| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4814 人关注过本帖, 1 人收藏
标题:顺序栈的栈顶指针
只看楼主 加入收藏
同生缘
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-18
结帖率:0
收藏(1)
 问题点数:0 回复次数:7 
顺序栈的栈顶指针
顺序栈的栈顶指针 当栈满时 指向 最后一个栈元素的上面,那个地址是不属于栈的,
会不会有问题?
注 严版 C语言数据结构
Push函数是这样压栈的
*S.top ++ = e;
栈指针指向刚压入元素的位置的上面。
如果压入之后,刚好满栈了,S.top++后,      那 S.top指向 一个不属于栈的位置。
搜索更多相关主题的帖子: C语言 元素 
2011-01-29 14:22
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
没有问题。有两个基本原因:
1、这里的“指针”其实是下标,不是真正的指针类型;
2、在入栈函数中,必然先检测“栈满”,因此,即使此时的“指针地址”不属于栈,也不会出问题,因为它没有被使用的机会。
另外,出栈操作是:先减指针,再取值。
还有,读栈顶元素的函数也是先减,后读。
综上,不会有问题的。

[ 本帖最后由 犬虫门心 于 2011-1-29 14:33 编辑 ]

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-01-29 14:31
同生缘
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-18
收藏
得分:0 
如果指向 一个未知的位置 有 风险 的吧 ,有朋友说:。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。

要是想深入了解栈,估计要看操作系统、编译器相关的书籍了。

满肯定有满的情况,不过貌似现在都处理好了,要么提示你非法访问,要么有虚拟内存映射栈空间,

所以在现在应该不会遇到这种情况了吧!

不像以前,内存小的可怜,一不小心就用满了。

理性爱国。
理性上网。
2011-01-29 14:55
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
以下是引用同生缘在2011-1-29 14:55:43的发言:

如果指向 一个未知的位置 有 风险 的吧 ,有朋友说:。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
 
要是想深入了解栈,估计要看操作系统、编译器相关的书籍了。
 
满肯定有满的情况,不过貌似现在都处理好了,要么提示你非法访问,要么有虚拟内存映射栈空间,
 
所以在现在应该不会遇到这种情况了吧!
 
不像以前,内存小的可怜,一不小心就用满了。
C语言很有意思,它的很多概念是“自满”(自圆其说)的。按照楼主的说法,那么链表中的指针,其危险性不是更大了么?假设有一个单向非循环链表,最后一个节点的next域值为NULL,链表首地址为ipHead,而下面的函数打算遍历链表,并输出数据域的内容,但不处理最后一个节点
typedef struct LINK
{
    int data;
    struct LINK *next;
}LINK;

void showLink(LINK *ipHead)
{
    for(; ipHead && ipHead->next; ipHead = ipHead->next)
        ;//在这里输出ipHead->data
}
关键是:    for(; ipHead && ipHead->next; ipHead = ipHead->next)划下划线的部分。
我想表达的问题是,按理说如果当前链表是“空链”,其初始的ipHead的值即为NULL,那么ipHead && ipHead->next这个条件判断中的ipHead->next就已经犯了严重错误了!
但事情不是这样的,这个表达式“很安全”,这全都归功于“短路运算”(若不清楚,请百度)。其实,这个问题是“短路运算”之所以能存在的意义所在。
结论:只要我们的程序能够做到“自满”,或者说,我们所提供的程序在逻辑上能够完满,那么,出现“空指针”并不是可怕的事情。关键的逻辑要严谨。

[ 本帖最后由 犬虫门心 于 2011-1-29 15:14 编辑 ]

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-01-29 15:13
同生缘
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-18
收藏
得分:0 
让指针指向数组第0个元素的前面或最末元素的后面,其效果是未定义的!让指针指向数组最末元素后面的那个位置是合法的(但指向0元素前面是非法的),但对这个指针执行间接访问可能会失败,再往后也非法了!(来自《C与指针》)

理性爱国。
理性上网。
2011-01-29 15:13
同生缘
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-11-18
收藏
得分:0 
有点不同,我有点钻牛角尖了,但精神领会了        你这个是可检测的(NULL),可控(短路),但是我的指针指向 不可测,不可预料指向 那个 敏感的位置,出现奇怪的错误
以下是引用犬虫门心在2011-1-29 15:13:30的发言:u
u
C语言很有意思,它的很多概念是“自满”(自圆其说)的。按照楼主的说法,那么链表中的指针,其危险性不是更大了么?假设有一个单向非循环链表,最后一个节点的next域值为NULL,链表首地址为ipHead,而下面的函数打算遍历链表,并输出数据域的内容,但不处理最后一个节点:
typedef struct LINK
{
    int data;
    struct LINK *next;
}LINK;

void showLink(LINK *ipHead)
{
    for(; ipHead && ipHead->next; ipHead = ipHead->next)
        ;//在这里输出ipHead->data
}
关键是:    for(; ipHead && ipHead->next; ipHead = ipHead->next)划下划线的部分。
我想表达的问题是,按理说如果当前链表是“空链”,其初始的ipHead的值即为NULL,那么ipHead && ipHead->next这个条件判断中的ipHead->next就已经犯了严重错误了!
但事情不是这样的,这个表达式“很安全”,这全都归功于“短路运算”(若不清楚,请百度)。其实,这个问题是“短路运算”之所以能存在的意义所在。
结论:只要我们的程序能够做到“自满”,或者说,我们所提供的程序在逻辑上能够完满,那么,出现“空指针”并不是可怕的事情。关键的逻辑要严谨。


[ 本帖最后由 同生缘 于 2011-1-29 15:26 编辑 ]

理性爱国。
理性上网。
2011-01-29 15:23
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
以下是引用同生缘在2011-1-29 15:13:36的发言:

让指针指向数组第0个元素的前面或最末元素的后面,其效果是未定义的!让指针指向数组最末元素后面的那个位置是合法的(但指向0元素前面是非法的),但对这个指针执行间接访问可能会失败,再往后也非法了!(来自《C与指针》)
这个说法其实是不完备的。
首先,“非法”和“失败”这两个词汇应该怎么理解?“非法”是将出现语法错误,“失败”是将出现所谓的“运行时错误”。
再一个:神马叫“其效果是未定义”?很似是而非。
数组和内存变量一样,都是“内存中的一段连续(逻辑上的)存储空间”,而这段空间的边缘 不存在 能让硬件或操作系统识别的“边界”;这就意味着,对计算机而言:数组只不过是漫长的线性内存空间中的一个小的区域,它前有村,后有店,就我们所编写的程序而言,根本不存在指针运算结果会无效(因为指针对于计算机或者C编译系统,都将它看成“无符号”量,永远不会有负值,而且其取值范围也在OS的工作范围以内),只存在其值是否满足操作系统的“保护地址”工作模式。如果满足操作系统的地址限制,那么超过“人文”数组内容的部分,可能的错误是“运行时”逻辑错误;否则是“运行时”致命错误。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-01-29 15:27
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
回复 6楼 同生缘
“有点不同,我有点钻牛角尖了,但精神领会了        你这个是可检测的(NULL),可控(短路),但是我的指针指向 不可测,不可预料指向 那个 敏感的位置,出现奇怪的错误”
我的核心概念是,程序是我们自己编写的,我们可以避免出现对“不可测”指针引用。这也是堆栈程序先检测,后操作的另一个副产品结果。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-01-29 15:33
快速回复:顺序栈的栈顶指针
数据加载中...
 
   



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

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