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

2017-02-08 16:07:50 +08:00
 Newyorkcity
/* 获取 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 』啊,你后头还有两个字符呢,我也没说申请更多的内存空间啊,你有什么可崩溃的!!!

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

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

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

const char* p = (const char*)"sdfsf"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/339036

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX