我尝试了以下程序:
#include <stdio.h>
char s1[] = "Global String";
char *s2 = "Another Global String";
main()
{
char s3[] = "Local String" ;
char *s4 = "Another Local String" ;
strcpy( s1, "New str" );
strcpy( s2, "New str" ); // causes seg fault
strcpy( s3, "New str" );
strcpy( s4, "New str" ); // causes seg fault
}
s2
和s4
导致细分错误,可能是因为它们存储在只读数据段中。为什么s1
和s3
指向的文字字符串不会崩溃?这是在Ubuntu上。
奇怪的是,s1
,s2
,s3
和s4
都可以修改,并且在cygwin上使用gcc编译时不会发生崩溃。这是为什么?
答案 0 :(得分:4)
char s1[] = "Global String";
为可写缓冲区保留空间,该缓冲区包含 字符串文字的副本。
char *s2 = "Another Global String";
声明一个指向包含字符串文字的只读缓冲区的指针。
答案 1 :(得分:3)
执行char *s2 = "Another Global String";
时,s2
是一个指向字符串常量的指针,并且通过执行strcpy( s2, "New str" );
您尝试在只读内存上写入,这是非法的。出于同样的原因,strcpy( s4, "New str" );
无效。
char s3[] = "Local String" ;
使s3
数组的长度与字符串常量相同(+1为尾随NULL)。该字符串将被复制到该数组中,您可以自由修改。
答案 2 :(得分:0)
strcpy
使用为其准备的内存。如果你有一个静态字符串,它可能在一个不可写的内存位置,所以如果你复制一个新的字符串,它就会崩溃。
您必须先保留内存或使用strdup
。