Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830600
  • 博文数量: 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++

2020-10-19 22:08:20


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>

  5. char *gettest();

  6. char *gettest()
  7. {
  8.         char *str;
  9.         char *s;

  10.         str = ( char *) malloc(sizeof(char)*10);

  11.         sprintf(str,"%s","Hello World!");
  12.         printf("STR = %s\n",str);

  13.         s = str;
  14.         printf("S1 = %s\n",s);

  15.         free(str);

  16.         printf("S2 = %s\n",s);
  17.         *str = NULL;
  18.         printf("STR1 = %s\n",str);
  19.         return(s);
  20. }

  21. int main ( void )
  22. {
  23.         char *p = NULL ;

  24.         p = gettest();

  25.         fprintf(stdout,"++++++++++ %s ++++++++++\n",p);
  26.         exit(0);
  27. }

我们观察上述代码,在 gettest 函数中,
第一步:使用 malloc 函数为 char *str 分配了一块内存。
第二步:我们用 sprintf 函数将 Hello world! 字符串拷贝到 str 中。
第三步,我们使用  s = str 来实现 char *s 指向了 char *str 的地址,此时,我们通过 printf 函数是可以打印出 s 的值的。
第四步,我们使用 free(str) ; 释放了 str 分配的内存,此时我们使用 printf 函数打印 s 的值,我们发现依然可以正确打印出 s 的值。
第五步:我们将 str 指针指向一个 NULL ,然后将 s 返回。此时,我们发现在我们的 main 函数中,这个 s 没有返回具体的值。

将上述代码做如下修改:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>

  5. char *gettest();

  6. char *gettest()
  7. {
  8.         char *str;
  9.         char *s;

  10.         str = ( char *) malloc(sizeof(char)*10);

  11.         sprintf(str,"%s","Hello World!");
  12.         printf("STR = %s\n",str);

  13.         s = str;
  14.         printf("S1 = %s",s);
  15.         free(str);

  16.         printf("S2 = %s",s);
  17. // *str = NULL;
  18.         printf("STR1 = %s\n",str);
  19.         return(s);
  20. }

  21. int main ( void )
  22. {
  23.         char *p = NULL ;

  24.         p = gettest();

  25.         fprintf(stdout,"++++++++++ %s ++++++++++\n",p);
  26.         exit(0);
  27. }

再次运行此段程序,我们发现在 main 函数中可以正确打印出 gettest 函数的返回值,也就是在 gettest 函数中定义的 char *s 指向的 char *str 地址处的值。

结论:
1、free 函数并没有真正将分配的内存清空,仅仅只是在内存中标记一下,该块内存区域可以被其它的进程使用了,叶就是说,在使用 free 函数后,该指针指向的内存区域是可以被其它的进程所覆盖,这导致了 str 指针指向的地址保存的具体值具有不确定性。
2、当我们将 *str 指向 NULL 时,由于 s 是通过指向 str 的地址来访问一块具体的内存区域的值的,因此当 *str = NULL 时,实际上是将 str 指向的某个地址的内存清空了,此时 s 指向该地址的值也就是 NULL 了。

这可以通过如下程序来验证。


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>

  5. char *gettest();

  6. char *gettest()
  7. {
  8.         char *str;
  9.         char *s;

  10.         str = ( char *) malloc(sizeof(char)*10);

  11.         sprintf(str,"%s","Hello World!");
  12.         printf("STR = %s\n",str);

  13.         s = str;
  14.         printf("S1 = %s",s);
  15.         free(str);

  16.         printf("S2 = %s",s);
  17.         sprintf(str,"RRRRRRRRR");
  18.         printf("STR1 = %s\n",str);
  19.         return(s);
  20. }

  21. int main ( void )
  22. {
  23.         char *p = NULL ;

  24.         p = gettest();

  25.         fprintf(stdout,"++++++++++ %s ++++++++++\n",p);
  26.         exit(0);
  27. }

我们发现,在 main 函数中打印出来的内容是 ++++++++++ RRRRRRRRR ++++++++++
由于我们在 gettest 韩式中再次对 str 多指向的内存区域进行了赋值 “RRRRRRRRR” , 所以在main 函数中打印出来的是 ++++++++++ RRRRRRRRR ++++++++++
这就充分说明了 s 指向的是 str 指针所指向的地址的值。


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