0

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

    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;
    	
    }

    这样代码就能顺利执行!

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论