C:为什么只有一些文字字符串会导致程序崩溃?

时间:2013-06-13 09:59:01

标签: c string

我尝试了以下程序:

#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
}

s2s4导致细分错误,可能是因为它们存储在只读数据段中。为什么s1s3指向的文字字符串不会崩溃?这是在Ubuntu上。

奇怪的是,s1s2s3s4都可以修改,并且在cygwin上使用gcc编译时不会发生崩溃。这是为什么?

3 个答案:

答案 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