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

将const指针定义为const字符串

发布时间:2020-12-16 10:38:54 所属栏目:百科 来源:网络整理
导读:乌尔里希·德雷珀(Ulrich Drepper)的醉酒,看到两个看似令人困惑的参赛作品. 在first one(全球空间中的字符串)中,Ulrich声明该字符串应定义为: const char _pcre_ucp_names[] = "blabla"; 虽然已经在second one(函数中的字符串),他认为应该声明为: static c
乌尔里希·德雷珀(Ulrich Drepper)的醉酒,看到两个看似令人困惑的参赛作品.

在first one(全球空间中的字符串)中,Ulrich声明该字符串应定义为:

const char _pcre_ucp_names[] = "blabla";

虽然已经在second one(函数中的字符串),他认为应该声明为:

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)只指向我们分配的字符串.

解决方法

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

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

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

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

编辑:

为了澄清,既然你编辑了你的问题,你不想使用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是一个指向字符串常量的指针,如果它是一个数组,那么就没有那个额外的指针.

(编辑:李大同)

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

    推荐文章
      热点阅读