-
#include <stdio.h>
-
#include <string.h>
-
#include <stdlib.h>
-
#include <malloc.h>
-
-
char *gettest();
-
-
char *gettest()
-
{
-
char *str;
-
char *s;
-
-
str = ( char *) malloc(sizeof(char)*10);
-
-
sprintf(str,"%s","Hello World!");
-
printf("STR = %s\n",str);
-
-
s = str;
-
printf("S1 = %s\n",s);
-
-
free(str);
-
-
printf("S2 = %s\n",s);
-
*str = NULL;
-
printf("STR1 = %s\n",str);
-
return(s);
-
}
-
-
int main ( void )
-
{
-
char *p = NULL ;
-
-
p = gettest();
-
-
fprintf(stdout,"++++++++++ %s ++++++++++\n",p);
-
exit(0);
-
}
我们观察上述代码,在 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 没有返回具体的值。
将上述代码做如下修改:
-
#include <stdio.h>
-
#include <string.h>
-
#include <stdlib.h>
-
#include <malloc.h>
-
-
char *gettest();
-
-
char *gettest()
-
{
-
char *str;
-
char *s;
-
-
str = ( char *) malloc(sizeof(char)*10);
-
-
sprintf(str,"%s","Hello World!");
-
printf("STR = %s\n",str);
-
-
s = str;
-
printf("S1 = %s",s);
-
free(str);
-
-
printf("S2 = %s",s);
-
// *str = NULL;
-
printf("STR1 = %s\n",str);
-
return(s);
-
}
-
-
int main ( void )
-
{
-
char *p = NULL ;
-
-
p = gettest();
-
-
fprintf(stdout,"++++++++++ %s ++++++++++\n",p);
-
exit(0);
-
}
再次运行此段程序,我们发现在 main 函数中可以正确打印出 gettest 函数的返回值,也就是在 gettest 函数中定义的 char *s 指向的 char *str 地址处的值。
结论:
1、free 函数并没有真正将分配的内存清空,仅仅只是在内存中标记一下,该块内存区域可以被其它的进程使用了,叶就是说,在使用 free 函数后,该指针指向的内存区域是可以被其它的进程所覆盖,这导致了 str 指针指向的地址保存的具体值具有不确定性。
2、当我们将 *str 指向 NULL 时,由于 s 是通过指向 str 的地址来访问一块具体的内存区域的值的,因此当 *str = NULL 时,实际上是将 str 指向的某个地址的内存清空了,此时 s 指向该地址的值也就是 NULL 了。
这可以通过如下程序来验证。
-
#include <stdio.h>
-
#include <string.h>
-
#include <stdlib.h>
-
#include <malloc.h>
-
-
char *gettest();
-
-
char *gettest()
-
{
-
char *str;
-
char *s;
-
-
str = ( char *) malloc(sizeof(char)*10);
-
-
sprintf(str,"%s","Hello World!");
-
printf("STR = %s\n",str);
-
-
s = str;
-
printf("S1 = %s",s);
-
free(str);
-
-
printf("S2 = %s",s);
-
sprintf(str,"RRRRRRRRR");
-
printf("STR1 = %s\n",str);
-
return(s);
-
}
-
-
int main ( void )
-
{
-
char *p = NULL ;
-
-
p = gettest();
-
-
fprintf(stdout,"++++++++++ %s ++++++++++\n",p);
-
exit(0);
-
}
我们发现,在 main 函数中打印出来的内容是 ++++++++++ RRRRRRRRR ++++++++++
由于我们在 gettest 韩式中再次对 str 多指向的内存区域进行了赋值 “RRRRRRRRR” , 所以在main 函数中打印出来的是 ++++++++++ RRRRRRRRR ++++++++++
这就充分说明了 s 指向的是 str 指针所指向的地址的值。
阅读(721) | 评论(0) | 转发(0) |