常量区不可写

时间:2023-02-01 15:04:40

// 常量区.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

char* x="china";
char y[]="china";
void fun1();
void fun2();
int main(int argc, char* argv[])
{

fun1();
fun2();
printf("Hello World!\n");
return 0;
}
void fun(){
//*(x)='a'; //不合法
y[0]='a'; //合法
printf("%s\n",x);
//printf("%s\n",y);
}
//在这个程序中,我们要能找到指针和数组名的去区别,x是指向“China”字符串的指针,y是存储“China”的一个字符数组,但是 *(x)='a';
//此操作在编译时时合法的,但是运行时会有00005异常,这是内存不可写的异常,但是y[0]='a';是合法的这是指针和数组操作的差异,因为x里面存放
//的是常量区的字符串“china"的首地址,进行*(x)='a';操作的意思是要修改常量区的字符串,而常量区是不能修改的,而通过字符数组去改是合法的
//这是因为会将常量区的字符串进行一次拷贝拷贝到非常量区进行修改,这是合法的。
//【注意:操作x="abc";操作时合法的,因为x本身就是一个指针变量,此操作只是将x指向字符串“abc"的首地址】

void fun2(){
char* x="china";
char y[]="china";

*(x)='z';
y[0]='z';
}
//这个更明显,char* x="china";与char y[]="china";这两个操作其内存分配都是不同的, char* x="china";只分配四字节的内存来存放常量区“China”
//字符串的首地址,所以*(x)='z';是不合法的操作,而char y[]="china";操作会将字符串常量“China”拷贝到函数的栈空间,所以char y[]="china";会分配到8字节的
//内存空间存放拷贝的字符串进行操作,所以y[0]='z';是合法的操作。