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

标签 c++ c arrays pointers gcc

第 1 部分

我有 2 个字符串,它们是通过以下方式定义的 -

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; 

关于c++ - 这两个字符串有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636494/

相关文章:

c++ - 是否可以通过地址访问 STL 双端队列元素?

C++打印缓冲区(整数到字符串)

c++ - Opencv C++ 识别数字

c - 当您写入内存超出数组范围时会发生什么?

c++ - 带有 pimpl 习语的模板化类不正确

c - 试图理解 pthread_cond_lock 和 pthread_cond_signal

c++ - 使用 gcc 在 Linux 上运行线程构建 block (Intel TBB)

arrays - R 将 3D 数组的第二维乘以每个第三维的向量

Python:判断跨n个数组的路径中的每一步是否都低于阈值

java - 通过 JNI 从 C++ 获取 java 数组