C文字,这些存储在哪里
请考虑以下代码:
#include <stdio.h> void f(const char * str) { str = "java"; } void main (int argc,char * argv[]) { const char *str = "erlang"; f(str); printf("%sn",str); } 输出是“erlang”,我不知道为什么.. 解决方法
许多好的答案都已准备就绪,但我认为我会尝试使用稍微修改过的代码来执行详细的步行. 考虑一下f(“Hello World”)会发生什么. “Hello World”是一个字符串文字.它初始化一个char数组.当数组传递给函数或分配给指针时,它将转换为数组的第一个元素的地址. f()在其str中接收“H”地址的副本. #1打印“Hello World”. str被重新分配给’j’的地址. #2打印“java”.该函数结束而不影响“Hello World”. 使用str =“erlang”,str接收’e’的地址. #3打印“erlang”.在函数调用中,main()的str的值被复制到f()的str. #1打印“erlang”.像以前一样,str被重新分配到’j’的地址. #2打印“java”.函数结束而不影响main()的str. #4打印“erlang”. #include <stdio.h> void f(const char * str) { printf("f() before str='%s'n",str); // #1 str = "java"; printf("f() after str='%s'n",str); // #2 } int main(void) { f("Hello World"); puts(""); const char *str = "erlang"; printf("main() before str='%s'n",str); // #3 f(str); printf("main() after str='%s'n",str); // #4 return 0; } 产量 f() before str='Hello World' f() after str='java' main() before str='erlang' f() before str='erlang' f() after str='java' main() after str='erlang' 至于OP的问题:
字符串文字的位置未在C中定义.它可能使用“进程地址空间,在部分常量内”,它可能不会.重要的是形成一个数组,并在赋值给const char *时给出第一个字符的地址.更详细:写入此地址是未定义的行为(UB),它可能“工作”,失败,seg-fault等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |