数组和指针之间的区别

时间:2013-05-22 13:19:34

标签: c arrays pointers strcpy

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

2 个答案:

答案 0 :(得分:13)

char* a = "Hello, World!";

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

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

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

char b[] = "Hello, World!"

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

答案 1 :(得分:1)

在你的第一个例子中,因为你试图写入a指向的只读内存,你将得到分段错误。如果你想使用指针,那么在堆上分配内存,使用后删除它。 其中b是用“Hello,World!”初始化的字符数组。

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