关于指向字符串的指针

43731894 2003-05-03 02:01:29
#include <CStdio>
void main()
{char *p="hello";
p="ok";
printf("%s",p);
}

请问在执行p="ok";时,"hello"有没有被清除出内存啊?如果没有,怎样把"hello"清除出内存?

...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hillyee 2003-05-03
  • 打赏
  • 举报
回复
char *p="hello";这样定义的指针变量被赋初值时,像"hello"没有固定的地址。一旦对*p重新赋值,p="ok";"hello"就消息了!
43731894 2003-05-03
  • 打赏
  • 举报
回复
谢谢xyouke(幽客)和Tommy()的精彩回答,让我这只小鸟又多长了几根羽毛^_^…………
xyouke 2003-05-03
  • 打赏
  • 举报
回复
修正一下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *p;
p=malloc(sizeof(char)*10);
printf("%p,%s\n",p,p);
strcpy(p,"hello");
printf("%p,%s\n",p,p);
strcpy(p,"ok");
printf("%p,%s\n",p,p);
free(p);
system("PAUSE");
return 0;
}
xyouke 2003-05-03
  • 打赏
  • 举报
回复
同意楼上观点!
Tommy 2003-05-03
  • 打赏
  • 举报
回复
to xyouke(幽客):
这样做是有问题的,结果是没有定义的,搞不好系统会崩溃的。
必须理解到,在c中是没有其它语言中字符串这样的类型的,所谓的字符串只是一个字符数组,或者是一个字符指针而已。因此,p="hello"并不是将"hello"的内容拷贝到p指向的空间,而是让字符指针p从指向分配到的内存,变为指向"hello",后面的free(p)并没有释放通过malloc取得的内存,释放不是通过malloc取得的内存,其后果是没有定义的。
你可以将printf("%s\n",p)改为printf(%p:%s\n",p,p),看看整个过程中p指针的值证实这点。你应该通过strcpy实现字符串的拷贝。

to 楼主:
C++中的标准库文件是没有后缀的,但是在这些头文件中定义的内容都属于namespace std的,这是C++中的内容,和高手不高手没有关系。在C++中,为了与C兼容,传统的.h方式的头文件还是可以用的。我看楼主的程序是C程序,还是用.h方式为好。

楼主的问题中,p只是一个字符串的指针,而"hello"和"ok"是两个常量字符串,这两个字符串不是通过动态分配得到的,不存在释放的问题。只有通过malloc分配的内存才需要释放。
xyouke 2003-05-03
  • 打赏
  • 举报
回复
就是调用系统命令"pause"
你试试
system("DIR"); //明白了吧^.^
system("PAUSE")
43731894 2003-05-03
  • 打赏
  • 举报
回复
不错,谢谢大家的回答。
有个问题想交流一下,为什么你们用头文件的时候都加.h啊?我听说现在高手编程用头文件都不加后缀!
还有一个问题,system("PAUSE")我以前没见过,现在用一下觉得不错,请问他还有那些参数啊?他还能实现什么功能啊?请高手指点(给点常用的就行,不要告诉我去什么书里找,俺没那么多书)分不够再加!!!!!
xyouke 2003-05-03
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char *p;
p=malloc(sizeof(char)*10);
p="hello";
printf("%s\n",p);
p="ok";
printf("%s\n",p);
free(p);
system("PAUSE");
return 0;
}
rori 2003-05-03
  • 打赏
  • 举报
回复
我也是初学,我认为没有被清除内存的。

cgl7890 2003-05-03
  • 打赏
  • 举报
回复
#include <Stdio.h>
应该是清除了,但这个应该不需要考虑的
getwill 2003-05-03
  • 打赏
  • 举报
回复
这种内存不用清除,过了生命周期自动释放!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧