【问题标题】:Difference between string created by array and pointer? [duplicate]由数组和指针创建的字符串之间的区别? [复制]
【发布时间】:2011-09-14 04:33:59
【问题描述】:

可能重复:
What is the difference between char s[] and char *s in C?

这有什么区别:

char arr[] = "Hello, world!";

还有这个:

char *arr = "Hello, world!";

两个字符串的内存分配在哪里?为什么我无法更改后一个字符串的内容?

【问题讨论】:

标签: c string


【解决方案1】:

第一个是专门为arr分配的可写内存,是chars的数组。您可以在不调用未定义行为的情况下对其进行修改。这是完全合法的:

char arr[] = "Hello, world!";
arr[1] = 'i';

第二个是指向只读字符串的指针。因此,这是未定义的行为

char *parr = "Hello, world!";
parr[1] = 'i'; // Cannot write to read-only memory!

一些编译器实现中:

char *a = "Hello, world!";
char *b = "Hello, world!";

a[1] = 'i';
// b[1] == 'i';

不能保证 - 我只是为了让您“直观”地了解它为什么是未定义行为。

【讨论】:

  • 两个字符串都是在栈上创建的吗?
  • 不,只读字符串存储在您正在处理的内存的只读部分中。
  • @teacher - arr 驻留在堆栈上,但 arr 指向的值驻留在只读位置,其位置取决于实现。
  • err..没有人提到 Second 被称为 String Literal
  • @Jesus:这是未定义行为的无数可能结果之一。我刚用 gcc 试过这个:char *s = "hello, world"; s[0] = 'H'; 程序因分段错误而死。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2013-05-17
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多