0

我尝试了以下程序:

#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导致分段错误,大概是因为它们存储在只读数据段中。为什么指向的文字字符串s1不会s3崩溃?这是在 Ubuntu 上。

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

4

3 回答 3

5
char s1[] = "Global String";

为包含字符串文字副本的可写缓冲区保留空间。

char *s2 = "Another Global String";

声明一个指向包含字符串文字的只读缓冲区的指针。

于 2013-06-13T10:01:19.200 回答
3

当你这样做时char *s2 = "Another Global String";s2是一个指向字符串常量的指针,并且通过这样做strcpy( s2, "New str" );你试图在只读内存上写入,这是非法的。同理strcpy( s4, "New str" );无效。

char s3[] = "Local String" ;创建s3一个与字符串常量长度相同的数组(尾随 NULL 为 +1)。该字符串将被复制到该数组中,您可以自由修改该数组。

于 2013-06-13T10:01:16.797 回答
0

strcpy使用为其准备的内存。如果你有一个静态字符串,它可能在一个不可写的内存位置,所以如果你复制一个新字符串到它,它理所当然地崩溃。

您必须先保留内存或使用strdup.

于 2013-06-13T10:01:55.633 回答