Chinaunix首页 | 论坛 | 博客
  • 博客访问: 823096
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: C/C++

2009-08-08 17:36:38

我们先来看如下一段代码:

#include
#include
#include

void SetProc(char **s,const int i);
int main ( void )
{
      char    *s1=NULL,*s2=NULL;
      int     i;
      i = 1;
      SetProc(&s1,i);
      fprintf(stderr,"S1 = %s\n",s1);
      i = i +1 ;
      SetProc(&s2,i);
      fprintf(stderr,"S2 = %s\n",s2);

      exit(0);
}

void SetProc(char **s,const int i)
{
     static   char    str[1024];

     bzero(str,sizeof(str));
     snprintf(str,sizeof(str)-1,"%d",i);
     *s = (char *)str;
}

以上代码执行起来得到的结果是:
S1 = 1
S2 = 2

执行结果正确。

我们把上面的函数稍稍调整一下。
#include
#include
#include

void SetProc(char **s,const int i);
int main ( void )
{
      char    *s1=NULL,*s2=NULL;
      int     i;
      i = 1;
      SetProc(&s1,i);
      i = i +1 ;
      SetProc(&s2,i);
      fprintf(stderr,"S1 = %s\n",s1);
      fprintf(stderr,"S2 = %s\n",s2);

      exit(0);
}

void SetProc(char **s,const int i)
{
     static   char    str[1024];

     bzero(str,sizeof(str));
     snprintf(str,sizeof(str)-1,"%d",i);
     *s = (char *)str;
}


执行后的结果是
S1 = 2
S2 = 2

我们仅仅是调整了函数中的红色部分的位置,从代码上看,没有任何地方改变了 S1 的指向位置,似乎结果不应该是这样啊。


这段代码出现问题的原因在于 *s1 , *s2 指向了同一块 buf ,而这个 buf 在两次执行 SetProc 后,其保存的值已经发生了改变。


这两天调一段程序,就发现了这个问题。
这大概是指针使用中非常容易忽视的一个问题了。

阅读(1252) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~