蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年6月6日 10:18


c 程序全局变量的问题

这几天被一个程序搞的头疼死了,问题是这样的,程序用到全局变量作为参数传递(全局变量是作为一个链表存在),在一个函数建立一个局部变量进行链表的操作完成后,然后传给全局变量,然后另外一个函数调用全局变量进行相关的操作。问题是程序不稳定,程序运行后处理第一次操作正常,以后就不正常,主要问题在链表节点的添加上。我又仔细看了一下程序,应该没有问题,于是我想知道这种问题,主要是因为什么造成的,不知道那位大哥能够替小弟解答。

另外我们在编程中遇到这样的问题,程序一开始不稳定,但将程序中作为测试的printf去掉后,程序会非常稳定,请问各位大哥这是什么问题

c 程序全局变量的问题

估计又是指针的麻烦

c 程序全局变量的问题

请具体谈一下

c 程序全局变量的问题

链表操作完成后 指针位置没有归位

c 程序全局变量的问题

-->

哈哈我也遇到这样的问题了,我一直在做一个字符串的截取,和拷贝,在这个过程中如果要看看我截取了什么东西,就报段错误.......大家说说看呢

我的截取子函数

[code]char * substring(char * father_str,int beg_p, int end_p)
{
        char * child_str;
        int lenth;
        lenth=end_p-beg_p;
        printf("father is  ,and lenth is %d and positoion %d --% d \n",lenth,beg_p,end_p);
        father_str=father_str+beg_p;
        for(lenth;lenth>;0;lenth--)
        {
                *child_str=*father_str;
                father_str++;
                child_str++;
                *child_str='\0';
                       
        }
        //printf("haha is %s \n",child_str);
        child_str=child_str-(end_p-beg_p);
        return child_str;
}
[/code]

c 程序全局变量的问题

c 程序全局变量的问题

注释掉printf后会编译成功吗

c 程序全局变量的问题

是的啊,把printf 注释掉以后一切正常,可以正常编译很运行......

有printf的时候可以通过编译,但运行的时候报"段错误"

c 程序全局变量的问题

应该是你的printf中有什么地方写错了。。。

c 程序全局变量的问题

TO yintao_1982:
  不用看了,程序肯定是错的。去掉printf能正常运行只能说明你命好。作为一个程序员,应当有一个认识,运行正常并不代表程序是正确的。在你的程序里,使用了一个野指针,没有为child_str分配空间,字符指针child_str的值是一个随机值-即child_str所指向的内存位置是不确定的。然后你对child_str所指向的内存空间进行读写操作,这就是你的程序的功能。

  在你的程序里面,你必须使用malloc, free函数对来分配、释放存储空间。

c 程序全局变量的问题

-->

基本可以确定有内存越界方面的问题

c 程序全局变量的问题

to renstone921:
          说的有道理,我去试一下看看

c 程序全局变量的问题

-->
请简单介绍一下内存越界方面的内容

c 程序全局变量的问题

-->

最简单的说法就是引用了不正确的地址

c 程序全局变量的问题

我想找一下正确的指针操作这样的代码,不知道哪位能提供帮助

c 程序全局变量的问题

-->

你对指针进行加减操作后如果还想用,那末就要把你加减过的指针想办法
恢复

c 程序全局变量的问题

高质量C++/C 编程指南,v 1.0
7.5 free 和delete 把指针怎么啦?
别看free 和delete 的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给
释放掉,但并没有把指针本身干掉。
用调试器跟踪示例7-5, 发现指针p 被free 以后其地址仍然不变( 非NULL),只是
该地址对应的内存是垃圾,p 成了“野指针”。如果此时不把p 设置为NULL,会让人误
以为p 是个合法的指针。
如果程序比较长,我们有时记不住p 所指的内存是否已经被释放,在继续使用p 之
前,通常会用语句if (p != NULL) 进行防错处理。很遗憾,此时if 语句起不到防错作
用,因为即便p 不是NULL 指针,它也不指向合法的内存块。
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p 所指的地址仍然不变

if(p != NULL) // 没有起到防错作用
{
strcpy(p, “world”); // 出错
}
示例7-5 p 成为野指针
7.6 动态内存会被自动释放吗?
函数体内的局部变量在函数结束时自动消亡。很多人误以为示例7-6 是正确的。理
由是p 是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉!
void Func(void)
{
char *p = (char *) malloc(100); // 动态内存会自动释放吗?
}
示例7-6 试图让动态内存自动释放
我们发现指针有一些“似是而非”的特征:
(1) 指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了NULL 指针。
这表明释放内存并不是一件可以草率对待的事。也许有人不服气,一定要找出可以
草率行事的理由:
如果程序终止了运行,一切指针都会消亡,动态内存会被操作系统回收。既然如此,
2001 Page 50 of 101

高质量C++/C 编程指南,v 1.0
在程序临终前,就可以不必释放内存、不必将指针设置为NULL 了。终于可以偷懒而不
会发生错误了吧?
想得美。如果别人把那段程序取出来用到其它地方怎么办?
7.7 杜绝“野指针”
“野指针”不是NULL 指针,是指向“垃圾”内存的指针。人们一般不会错用NULL
指针,因为用if 语句很容易判断。但是“野指针”是很危险的,if 语句对它不起作用。
“ 野指针”的成因主要有两种:
(1) 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL 指针,它
的缺省值是随机的, 它会乱指一气。所以, 指针变量在创建的同时应当被初始化,要么
将指针设置为NULL ,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);
(2)指针p 被free 或者delete 之后, 没有置为NULL, 让人误以为p 是个合法的指针。
参见7.5 节。
(3) 指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &amp; // 注意 a 的生命期
}
p->;Func(); // p 是“野指针”
}
函数Test 在执行语句p->;Func() 时,对象a 已经消失,而p 是指向a 的,所以p 就
成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。

c 程序全局变量的问题

今天又把程序仔细的检查了一下,发现指针内存空间的释放没有做好,重新改过,程序正常,以后程序一定要注意对指针的操作

c 程序全局变量的问题

感谢楼上大哥文章,非常感谢

c 程序全局变量的问题

楼上的说的太对了,你运气真好,这样写99%会出问题的



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com