昨天我在自制的“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..
答案 0 :(得分:13)
char* a = "Hello, World!";
为您提供指向字符串文字的指针。只读存储器中可能存在字符串文字,因此无法更改其内容。
char* a = "Haha"; //works
a = "LOL"; //works..
将指针a
更改为指向不同的字符串文字。它不会尝试修改任何字符串文字的内容,因此是安全/正确的。
char b[] = "Hello, World!"
在堆栈上声明一个数组,并使用字符串文字的内容对其进行初始化。堆栈内存是可写的,因此更改内存的内容非常安全。
答案 1 :(得分:1)
在你的第一个例子中,因为你试图写入a指向的只读内存,你将得到分段错误。如果你想使用指针,那么在堆上分配内存,使用后删除它。 其中b是用“Hello,World!”初始化的字符数组。
在第二个例子中,你使指针指向不同的字符串文字,这应该没问题。