char s[]和char *s有什么区别?

581

在 C 语言中,可以像这样在声明中使用字符串字面量:

char s[] = "hello";

或者像这样:

char *s = "hello";

那么它们有什么区别呢?我想知道在编译时和运行时的存储持续时间实际上发生了什么。


12
好的,我会尽力以最简单明了的方式翻译这些内容。下面是需要翻译的网页:http://c-faq.com/aryptr/index.html这个网页解释了指针和数组在C语言中的基本概念和用法,包括如何声明、初始化、访问和释放内存等。http://c-faq.com/charstring/index.html这个网页解释了C语言中字符和字符串的基本概念和用法,包括如何声明、初始化、赋值、比较、连接和格式化输出等。 - Sinan Ünür
12
char *s = "hello",这里的 s 在运行时可以指向另一个字符串,我指的是它不是常量指针,您可以在运行时分配另一个值 p = "Nishant"。而对于 s[],这里的 s 是一个常量指针,不能重新分配另一个字符串,但我们可以在 s[index] 处分配另一个字符值。 - Nishant Kumar
@Nishant 你的意思是..你可以在运行时分配另一个值给 s = "Nishant",而 s[] ... 你是这个意思吗?否则,在上下文中有点令人困惑。 - Yifangt
14个回答

2
char *str = "Hello";

以上代码将str指向程序二进制映像中硬编码的文本值"Hello",该值在内存中被标记为只读,这意味着任何对该字符串常量的更改都是非法的,并会导致分段错误。

char str[] = "Hello";

将字符串复制到堆栈上新分配的内存中。因此,对其进行任何更改都是允许和合法的。

means str[0] = 'M';

将字符串更改为"Mello"。

有关更多详细信息,请查看类似问题:

为什么使用“char *s”初始化的字符串会导致分段错误,而使用“char s []”则不会?


1
char *s1 = "Hello world"; // Points to fixed character string which is not allowed to modify
char s2[] = "Hello world"; // As good as fixed array of characters in string so allowed to modify

// s1[0] = 'J'; // Illegal
s2[0] = 'J'; // Legal

0

在这种情况下:

char *x = "fred";

x 是一个lvalue -- 它可以被赋值。但在以下情况中:

char x[] = "fred";

x不是左值,它是右值——你不能对其赋值。


4
从技术上讲,“x”是一个不可修改的左值。但在几乎所有情况下,它会被评估为指向其第一个元素的指针,而那个值是一个右值。 - caf

-1
鉴于这里的评论,很明显:char * s = "hello" ; 是一个不好的想法,应该在非常狭窄的范围内使用。
这可能是一个很好的机会来指出“const正确性”是一件“好事情”。无论何时何地,都要使用“const”关键字来保护您的代码,免受“放松”的调用者或程序员的影响,通常当指针进入时最容易“放松”。
足够夸张了,以下是当点睛指针与“const”相结合时可以实现的内容。(注意:必须从右到左阅读指针声明。)以下是在处理指针时保护自己的3种不同方法:
const DBJ* p means "p points to a DBJ that is const" 

也就是说,通过 p 无法更改 DBJ 对象。

DBJ* const p means "p is a const pointer to a DBJ" 

也就是说,你可以通过 p 改变 DBJ 对象,但是你不能改变指针 p 本身。

const DBJ* const p means "p is a const pointer to a const DBJ" 

也就是说,您不能更改指针p本身,也不能通过p更改DBJ对象。

试图更改常量的错误在编译时被捕获。const没有运行时空间或速度惩罚。

(当然,假设您正在使用C++编译器?)

--DBJ


这一切都是正确的,但与问题无关。至于你对C++编译器的假设,问题标记为C,而不是C ++。 - Fabio says Reinstate Monica
char *s = "const string" 并没有什么不好的。 - Paul Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接