/* 获取 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 』啊,你后头还有两个字符呢,我也没说申请更多的内存空间啊,你有什么可崩溃的!!!
1
Newyorkcity OP (⊙o⊙)哦 我突然想起来,如果用 char *str = "hello"这样定义字符串和 char str[] = "hello"定义字符串,两者的差别是很大的。前者保存的内存空间是很前面的,是只能访问不能写入的?
|
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" |