LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1302|回复: 3

运行了strtok后的内存如何释放?

[复制链接]
发表于 2006-2-7 19:36:19 | 显示全部楼层 |阅读模式
程序:
[php]
#include <string.h>
int
main ()
{
  char *a = NULL;
  char *b = NULL;
  a = strdup ("hello world !");

  b = strtok (a, " ");

  printf ("a=%s\n", a);
  printf ("b=%s\n", b);
  printf ("\n");

  b = strtok (NULL, " ");

  printf ("a=%s\n", a);
  printf ("b=%s\n", b);
  printf ("\n");

//free(b);
  free (a);

  printf ("a=%s\n", a);
  printf ("b=%s\n", b);
}

[/php]
结果显示:
a=hello
b=hello

a=hello
b=world

a=
b=world
怎样将原string完全释放掉?
发表于 2006-2-7 23:20:37 | 显示全部楼层
看来strdup后你得自己保存一份这个指针值了,呵呵
回复 支持 反对

使用道具 举报

发表于 2006-2-8 10:27:12 | 显示全部楼层
已经释放了
释放 不等于 把整个那块区域以0填充
目前glibc的实现只是把前4个字节弄成0
试试这个

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main ()
  5. {
  6.   char *a = NULL;
  7.   char *b = NULL;
  8.   a = strdup ("hello world !");

  9.   b = strtok (a, " ");

  10.   printf ("a=%s\n", a);
  11.   printf ("b=%s\n", b);
  12.   printf ("\n");

  13.   b = strtok (NULL, " ");

  14.   printf ("a=%s\n", a);
  15.   printf ("b=%s\n", b);
  16.   printf ("\n");

  17. //free(b);
  18.   free(a);

  19.   printf ("a=%s\n", a);
  20.   printf ("b=%s\n", b);
  21.   printf ("\n");

  22.   a = (char *)malloc(sizeof("hello world !") + 1);
  23.   printf("now malloc an buffer whose size is equal to "hello world !"\n"
  24.          "this buffer is just the buffer which strdup previously returned\n"
  25.          "which means strdup returned buffer is reused, coz it's been freed\n");
  26.   strcpy(a, "hello earth !");
  27.   printf("now copy "earth" to where "world" originally resides\n");
  28.   printf ("and b becomes: %s\n", b);

  29. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-2-8 18:59:29 | 显示全部楼层
哦,对了,指针a的值并没有被改变
free(a)就释放了
前面我想错了,呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表