【问题标题】:Difference between array and pointer [duplicate]数组和指针之间的区别[重复]
【发布时间】:2013-05-17 13:42:12
【问题描述】:

昨天我在使用自制的“strcpy”函数时遇到了一点麻烦。它现在虽然有效,但我有点困惑!

char* a = "Hello, World!"; //Works
char b[] = "Hello, World!"; //Works also

strcpy(a, "Hello!"); //Segmentation fault
strcpy(b, "Haha!!"); //Works..

区别在哪里?为什么 char 指针会导致“分段错误”?

为什么这甚至行得通? :

char* a = "Haha"; //works
a = "LOL"; //works..

【问题讨论】:

标签: c arrays pointers strcpy


【解决方案1】:
char* a = "Hello, World!";

为您提供指向字符串文字的指针。字符串文字可能存在于只读内存中,因此其内容无法更改。

char* a = "Haha"; //works
a = "LOL"; //works..

将指针@​​987654323@ 更改为指向不同的字符串文字。它不会尝试修改任一字符串文字的内容,因此是安全/正确的。

char b[] = "Hello, World!"

在堆栈上声明一个数组,并用字符串文字的内容对其进行初始化。堆栈内存是可写的,因此更改此内存的内容非常安全。

【讨论】:

  • @NormalPeopleScareMe 没错。它指向一个字符串 constant.
  • 嗯,这是未定义的行为,所以它可能有效,也可能无效。我的建议是永远假设它不会。
  • @NormalPeopleScareMe 这取决于它指向什么。您不能修改指向字符串文字的指针的内容,但可以修改指向堆栈或堆分配字符串的指针的内容。
  • 谢谢你们。西蒙克,你帮了我很多!
  • -Wwrite-strings 编译会告诉gcc 记住字符串常量是如何的:它会给你一个关于这段代码的警告。
【解决方案2】:

在您的第一个示例中,由于您尝试写入 a 指向的只读内存,您将遇到分段错误。如果您想使用指针,则在堆上分配内存,使用并在使用后删除它。 其中 b 是一个用“Hello, World!”初始化的字符数组。

在第二个示例中,您将指针指向不同的字符串文字,这应该没问题。

【讨论】:

  • 我觉得这个答案很有帮助。我不知道字符串文字位于只读内存中。我还找到了一个教程,如何将 char 指针与 strcpy 结合使用,这导致了这里的分段错误,他们正在分配内存,我无法追溯他们为什么这样做。谢谢。
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 2010-11-23
  • 2011-12-02
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
相关资源
最近更新 更多