免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2955 | 回复: 12
打印 上一主题 下一主题

c语言的两个问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-20 10:23 |只看该作者 |倒序浏览
例1:
char *p="hello";
p[0]='X';

问题1:
例1这个程序运行是正常的,但有一点我不明白。指针p指向的是字符串常量”hello",不是说字符串常量不可以改动吗,为什么还能正常运行呢????


例2
char *p=NULL;
p=(char *)malloc(sizeof(char)*100);
free(p);
strcpy(p,"hello");
puts(p);

问题2:
例2这个程序运行是正常的,但有一点我不明白。free(p),不是把p指针指向的内存释放了吗,为什么strcpy(p,"hello")还好用呢??????

论坛徽章:
3
白羊座
日期:2013-11-05 12:59:14子鼠
日期:2014-01-29 14:14:50戌狗
日期:2014-02-11 16:21:45
2 [报告]
发表于 2010-02-20 10:33 |只看该作者
问题1:取决于编译器。
问题2:free的作用是告诉OS“这块内存我不用了,可以拿去给别人用”,但并不会阻止你继续“偷偷地”用它。偷偷用的后果是一旦“别人”也用到了这块内存,你们俩就冲突了

论坛徽章:
0
3 [报告]
发表于 2010-02-20 10:47 |只看该作者
谢谢

论坛徽章:
0
4 [报告]
发表于 2010-02-20 11:02 |只看该作者
问题1:取决于编译器。
问题2:free的作用是告诉OS“这块内存我不用了,可以拿去给别人用”,但并不会阻止 ...
ahocat 发表于 2010-02-20 10:33



    好你还没有看过哪个编译器不支持呢!!

论坛徽章:
0
5 [报告]
发表于 2010-02-20 11:15 |只看该作者
程序1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
   char *a;
   a=(char *)malloc(sizeof(char)*100);
   strcpy(a,"hello");
   while(1){
       printf("address[%d]\n",a);
       puts(a);
       sleep(1);
   }
   return 0;
}

程序2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
   char *a;
   while(1){
       a=atoi(argv[1]);
       printf("address[%d]\n",a);
       strcpy(a,"world");
       puts(a);
       sleep(1);
   }
   return 0;
}

这两个程序指向同一个内存地址为什么互不影响啊???

论坛徽章:
0
6 [报告]
发表于 2010-02-20 11:17 |只看该作者
问题1:取决于编译器。


哪些支持编译器支持,那些不支持啊?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2010-02-20 11:20 |只看该作者
好你还没有看过哪个编译器不支持呢!!
chinesedragon 发表于 2010-02-20 11:02


编译器一般不会管那么多,最多一个警告,但运行就难说了,看系统了。
系统上,如果read only真的是read only,那就挂了。
linux-0gt0:~/weiqi # cat 1.c
#include <stdio.h>
int main()
{
        char *p="hello";
p[0]='X';
printf("%s\n",p);
        return 0;
}
linux-0gt0:~/weiqi # gcc 1.c -Wall
linux-0gt0:~/weiqi # ./a.out
Segmentation fault

论坛徽章:
0
8 [报告]
发表于 2010-02-20 11:32 |只看该作者
哦,我用sco和aix都可以

论坛徽章:
0
9 [报告]
发表于 2010-02-20 11:45 |只看该作者
程序1
#include
#include
#include
int main(int argc, char **argv)
{
   char *a;
   a=(char  ...
zjgbkhm 发表于 2010-02-20 11:15



    这程序能编译过吗???????

论坛徽章:
0
10 [报告]
发表于 2010-02-20 11:49 |只看该作者
能编译过去,还能正常运行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP