当字符变量作为函数参数时传递常量字符引发的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bjbz_cxy/article/details/79804787

当我们将char数组或指针类型作为函数参数时,编译器为了节省内存,和提高效率会自动将参数转换为指针,指向形参的内存地址,间接引用!

列如如下代码:

int test(char str[256]){
	return 0;
}

在编译之后,编译器会将其转换成指针:

int test(char *str){
	return 0;
}

所以无论你的数组大小是多大,最后都会被变成跟随编译器位数大小的指针

由此会产生一个问题:

int test(char str[256]){
	str[0] = 'c';
	return 0;
}
int main(){
	test("hello word");
	return 0;
	
}

以上代码如果运行会中断到:

str[0] = 'c';

这一行,原因很简单,作为参数的str字符数组变量已经被变成了char*指针变量,此时我们传递进去的是一个常量字符:

"hello word"

它是没有独立内存的,与指令同在一块内存,也称为立即数,详细请参见: 深度理解“指令集”,代码段的段描述符明确描述这块地址是read的,不允许写,所以当我们在执行:

str[0] = 'c';

这一段代码时会中断错误。其中断错误代码是在操作系统内核规定的为:此处内存只能为read,因此内存无法write

所以我们要将传递的参数改为变量传递过去:

int test(char str[256]){
	str[0] = 'c';
	return 0;
}
int main(){
	char str[] = "hello word";
	test(str);
	return 0;
	
}

 

这样代码就能顺利执行!

 

 

展开阅读全文

没有更多推荐了,返回首页