这两个字符串有什么区别?

时间:2013-05-19 15:51:38

标签: c++ c arrays pointers gcc

第1部分

我有两个字符串,它们按以下方式定义 -

char s1[] = "foo";
char *s2 = "foo";

当我尝试更改这些字符串的字符时,例如,第二个字符 -

char s1[1] = 'x';
char s2[1] = 'x';

字符串s1中的字符发生了变化,但更改字符串s2中的字符会出现此错误 - Segmentation fault (core dumped)

为什么会这样?

为什么我无法更改以其他方式定义的字符串的字符?


第2部分

字符串(它们是字符数组,对吗?)可以使用 - char *s = "foo"进行初始化 但是当我尝试使用像int *arr = {1, 2, 3}这样的相同的东西初始化不同类型的数组时,为什么编译器会发出警告?

foo.c: In function ‘main’:
foo.c:5:5: warning: initialization makes pointer from integer without a cast [enabled by default]
foo.c:5:5: warning: (near initialization for ‘foo’) [enabled by default]
foo.c:5:5: warning: excess elements in scalar initializer [enabled by default]
foo.c:5:5: warning: (near initialization for ‘foo’) [enabled by default]
foo.c:5:5: warning: excess elements in scalar initializer [enabled by default]
foo.c:5:5: warning: (near initialization for ‘foo’) [enabled by default]

注意:我的编译器是GCC。

1 个答案:

答案 0 :(得分:4)

第一个字符串是一个字符数组,填充字符串“foo”中的字符,第二个字符串是指向值为“foo”的常量的指针。由于第二个是常量,因此不允许对其进行修改。

不,你不能初始化一组指向值的指针 - 因为指针没有实际的内存来存储分配给它的值。你需要让它指向另一个数组:

int foox[3] = { 1, 2, 3 };
int *foo = foox;

或者您需要分配一些内存,然后存储值:

int *foo = malloc(sizeof(int) * 3);

foo[0] = 1; 
foo[1] = 2; 
foo[2] = 3;