4

昨天我在自制的“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..
4

2 回答 2

13
char* a = "Hello, World!";

给你一个指向字符串文字的指针。字符串文字可能存在于只读内存中,因此其内容无法更改。

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

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

char b[] = "Hello, World!"

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

于 2013-05-22T13:21:27.370 回答
1

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

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

于 2013-05-22T13:27:44.343 回答