这两根弦有什么不同?

What is the difference between these two strings?

本文关键字:什么 两根      更新时间:2023-10-16

PART 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。

第一个是字符串,它是一个字符数组,由字符串"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;