当前位置:  开发笔记 > 编程语言 > 正文

将const指针定义为const字符串

如何解决《将const指针定义为const字符串》经验,为你挑选了1个好方法。

乌尔里希·德雷珀(Ulrich Drepper)的醉酒,看到两个看似令人困惑的参赛作品.

第一个(全局空间中的字符串)中,Ulrich声明字符串应定义为:

const char _pcre_ucp_names[] = "blabla";

虽然已经在第二个(函数中的字符串),他认为它应该声明为:

static const char _pcre_ucp_names[] = "blabla";

你能解释什么是更好的名称来解析一个字符串?

UDP:

首先,我删除了C++标记 - 这个问题对C和C++都有效.所以我认为答案不能解释类/函数/文件范围中的静态意义是否相关.

在回答之前阅读文章.文章涉及内存使用 - 存储实际数据(在.rodata或.data部分),字符串应该重新定位(如果我们谈论unix/linux共享对象),是否可以更改字符串与否.

UDP2第一个中,它表示对于全局变量的形式:

(1) const char *a = "...";

不太好

(2) const char a[] = "..."

为什么?我一直认为(1)更好,因为(2)实际上复制了我们分配它的字符串,而(1)只指向我们分配的字符串.



1> LnxPrgr3..:

这取决于 - 如果您需要字符串对项目中的其他源文件可见,则无法声明它static.如果您只需要从定义它的文件中访问它,那么您可能想要使用它static.

你提到的博客文章是在谈论不同的东西:

#include 
#include 
int main(void)
{
  const char s[] = "hello"; /* Notice this variable is inside a function */
  strcpy (s, "bye");
  puts (s);
  return 0;
}

在这种情况下,static意味着不同的东西:这会创建一个变量,该变量在对同一函数的多次调用中持续存在.他的另一个例子显示了一个函数之外的全局变量.

编辑:

为了澄清,既然您编辑了问题,那么您不想使用的原因const char *a = "string"是您创建了一个额外的可写指针.这意味着,虽然您无法更改字符串的字符,但您仍然可以使指针指向完全​​不同的字符串.见下文:

const char *hello = "hello";

int main( int argc , char const *argv[] )
{
    hello = "goodbye";
    puts(hello);
    return 0;
}

该示例编译并运行.如果hello应该是常量,那肯定不是你想要的.当然,你也可以写下这个来解决这个问题:

const char * const hello = "hello";

你仍然有两个变量你只需要一个 - hello是一个指向字符串常量的指针,如果它是一个数组,那么就没有那个额外的指针.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有