当我们将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; }
这样代码就能顺利执行!