免费注册 查看新帖 |

Chinaunix

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

今天遇到的一个极品指针问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-27 15:56 |只看该作者 |倒序浏览
俺 比较菜,见笑了。
先来代码吧:

#include <stdio.h>

int main(void)
{

     char* string = "something";

     while(*string)
     {
       *string++ = 'd';
     }

     printf("The result is: %s\n",test);
}

问题, 编译通过,但运行到while 里面的时候出错了。。

错误提示(vs2005.net):Unhandled exception at 0x00413604 in contact.exe: 0xC0000005: Access violation writing location 0x0041565c.

谢谢!!

论坛徽章:
0
2 [报告]
发表于 2007-12-27 16:05 |只看该作者
你这能编译过?

典型错误。
搞清楚
char* string = "something";

char string[] = "something";
的区别就知道为什么出错了。

论坛徽章:
0
3 [报告]
发表于 2007-12-27 16:09 |只看该作者
string指向的是字符串常量"something"
存放在进程的“只读”内存区域,往里面写东西当然要出错了

论坛徽章:
0
4 [报告]
发表于 2007-12-27 16:43 |只看该作者
非常感谢上面几个热心的大哥,问题已经解决。。现在贴上代码。
char* concat(char* string1,char* string2)
{
        static char original[30] = {0};
        int index=0;
        while(*string1)
        {
                original[index++] = *string1++;
        }

        while(*string2)
        {
                original[index++] = *string2++;
        }
        original[index] = '\0';
        return original;
}

这个代码肯定写得很不好,无耐学艺不精,只能慢慢学习了。

论坛徽章:
0
5 [报告]
发表于 2007-12-27 16:44 |只看该作者
没看出哪里极品

论坛徽章:
0
6 [报告]
发表于 2007-12-27 17:23 |只看该作者
这问题以前讨论过很多次的. 而且还讨论过不同编译器的情况.

论坛徽章:
0
7 [报告]
发表于 2007-12-27 23:34 |只看该作者
原帖由 lgfang 于 2007-12-27 16:05 发表
你这能编译过?

典型错误。
搞清楚
char* string = "something";

char string[] = "something";
的区别就知道为什么出错了。


不要误导别人,虽然这个代码执行会崩溃,但是编译是绝对可以通过的。 你要搞清楚什么是compiler , 什么是linker and loader 。这个代码之所以崩溃不是因为不符合C99的语义,是因为linker和loader让它崩溃。

在linux kernel里,如果你没开一个RODATA的选项(缺省一般都没开)

创建一个简单的函数,其代码只有下面2行:
char *str= "hello";
*str = 'H' ;
这样编译运行都没问题的。

论坛徽章:
0
8 [报告]
发表于 2007-12-28 09:42 |只看该作者
c语言程序组成
编译时:如数组,变量名,语法等,complier完成
运行时:逻辑运算,赋值运算等,linker and loader完成

论坛徽章:
0
9 [报告]
发表于 2007-12-28 13:11 |只看该作者
"极品指针"第一次听到,
楼主还是做广告策划比较合适。

论坛徽章:
0
10 [报告]
发表于 2007-12-28 13:30 |只看该作者
原帖由 lgfang 于 2007-12-27 16:05 发表
你这能编译过?

典型错误。
搞清楚
char* string = "something";

char string[] = "something";
的区别就知道为什么出错了。


换成char string[]是编不过的吧。string不能作为左值的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP