加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C文字,这些存储在哪里

发布时间:2020-12-16 10:02:03 所属栏目:百科 来源:网络整理
导读:请考虑以下代码: #include stdio.hvoid f(const char * str) { str = "java";}void main (int argc,char * argv[]) { const char *str = "erlang"; f(str); printf("%sn",str);} 输出是“erlang”,我不知道为什么.. 我目前的知识说,字符串文字“erlang”和
请考虑以下代码:

#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”,我不知道为什么..
我目前的知识说,字符串文字“erlang”和“java”都存储在进程地址空间中,在“常量”部分中.根据这个,fucntion f应该将指针改为指向“java”,但这不会发生.有人可以解释一下这里发生了什么吗?

解决方法

Could someone please explain what is going on here?

许多好的答案都已准备就绪,但我认为我会尝试使用稍微修改过的代码来执行详细的步行.

考虑一下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 literals,where are these stored?

字符串文字的位置未在C中定义.它可能使用“进程地址空间,在部分常量内”,它可能不会.重要的是形成一个数组,并在赋值给const char *时给出第一个字符的地址.更详细:写入此地址是未定义的行为(UB),它可能“工作”,失败,seg-fault等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读