V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

C 语言指针问题,这段代码为何报错??

  •  
  •   Newyorkcity · 2017-02-08 16:07:50 +08:00 · 988 次点击
    这是一个创建于 2657 天前的主题,其中的信息可能已经有所发展或是发生改变。
    /* 获取 hello 的前两个字符 he */
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int main(){
    	char *str = "hello";
    	char *p = strchr(str,'l');
    	char *temp = p;
    	printf("temp = %p\n",temp);
    	printf("*temp = %c\n",*temp);
    //	*p = '\0';
    	printf("%s\n",str);
    //	*temp = *p;
    	printf("%s\n",str);
    }
    

    注释的两行代码,任意一个去掉注释,在编译时无错误无警告,但是运行起来则立刻弹出 xxx.exe (就是代码文件对应的可执行程序)运行错误。。
    好气啊理论上这种错误应该是出自内存空间不足吧,可是我指针 p 指向的是字符『 l 』啊,你后头还有两个字符呢,我也没说申请更多的内存空间啊,你有什么可崩溃的!!!

    2 条回复    2017-02-08 16:24:17 +08:00
    Newyorkcity
        1
    Newyorkcity  
    OP
       2017-02-08 16:12:55 +08:00
    (⊙o⊙)哦 我突然想起来,如果用 char *str = "hello"这样定义字符串和 char str[] = "hello"定义字符串,两者的差别是很大的。前者保存的内存空间是很前面的,是只能访问不能写入的?
    xss
        2
    xss  
       2017-02-08 16:24:17 +08:00   ❤️ 2
    char *p = "sdfsf";

    编译阶段编译器(大部分编译器都是此处理逻辑), 会将 sdfsf 这个字符串放到程序的.data 节中(elf 文件放入到等同于.data 节的区域). .data 节的数据在被系统的装载器装载到内存的时候具有只读属性.

    所以, 你的程序其实应该这么写才标准:

    const char* p = (const char*)"sdfsf"
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2489 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:24 · PVG 22:24 · LAX 07:24 · JFK 10:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.