2023.07.30 | admin | 132次围观
当我们将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;
}
这样代码就能顺利执行!
版权声明
本文仅代表作者观点。
本文系作者授权发表,未经许可,不得转载。
发表评论