首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >const char*诉const char[]

const char*诉const char[]
EN

Stack Overflow用户
提问于 2015-03-12 11:21:19
回答 3查看 26.4K关注 0票数 21

据我所知,像"Hello“这样的字符串

被认为是C中的char*和C++中的const char*,对于这两种语言,字符串文本都存储在只读内存中。(如果我错了,请纠正我)。

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    const char* c1;
    const char* c2;

    {
        const char* source1 = "Hello";
        c1 = source1;

        const char source2[] = "Hi"; //isn't "Hi" in the same memory region as "Hello" ?
        c2 = source2;
    }

    printf("c1 = %s\n", c1); // prints Hello
    printf("c2 = %s\n", c2); // prints garbage

    return 0;
}

为什么source1和source2的行为不同?(用gcc -std=c11 -W -O3编译)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-12 11:26:48

在这个代码片段中

代码语言:javascript
复制
 {
  const char* source1 = "Hello";
  c1 = source1;

  const char source2[] = "Hi"; //isn't "Hi" in the same memory region as "Hello" ?
  c2 = source2;
 }

source2是代码块的本地字符数组,在退出结束大括号后的块后将被销毁。

至于字符文字,则它具有静态存储时间。因此,在退出代码块后,指向字符串文字的指针将是有效的。字符串文本将与字符数组相对存在。

考虑到在C中,字符串文本"Hello"的类型是char [6]。也就是说,任何字符串的类型都是一个非const字符数组。不过,您可能不会使用常特字符串字面值。在C++中,与C相反的字符文本有类型的const字符数组。

票数 12
EN

Stack Overflow用户

发布于 2015-03-12 11:25:30

代码语言:javascript
复制
const char* source1 = "Hello";

source1只是内存位置的指针,其中定义了Hello .

代码语言:javascript
复制
const char source2[] = "Hi";

source2是字符类型数组的局部变量,并具有另一个地址,即字符串-文字Hi。在第一次} source2被销毁之后,c2将被指向某个地方,而不是在source2的位置上,因此,在source2被销毁后,这只是取消引用c2的未定义行为。

票数 7
EN

Stack Overflow用户

发布于 2018-12-20 15:26:14

"Hi“不是和"Hello”在同一个内存区域吗?

你(巧妙地)错了。"Hello"本身就是(const) char *类型的表达式,而char source2[] = "Hi";是定义、声明和初始化char [3]对象的语句。在视线中看不到const char *。在函数范围中,对象具有自动存储持续时间。

在您的使用中,source2在下面的}中不再存在,并使c2成为无效的指针。后来对c2的使用还没有定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29008425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档