V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · Feb 8, 2017 · 1301 views
    This topic created in 3371 days ago, the information mentioned may be changed or developed.
    /* 获取 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 replies    2017-02-08 16:24:17 +08:00
    Newyorkcity
        1
    Newyorkcity  
    OP
       Feb 8, 2017
    (⊙o⊙)哦 我突然想起来,如果用 char *str = "hello"这样定义字符串和 char str[] = "hello"定义字符串,两者的差别是很大的。前者保存的内存空间是很前面的,是只能访问不能写入的?
    xss
        2
    xss  
       Feb 8, 2017   ❤️ 2
    char *p = "sdfsf";

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

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

    const char* p = (const char*)"sdfsf"
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   863 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:49 · PVG 02:49 · LAX 11:49 · JFK 14:49
    ♥ Do have faith in what you're doing.