C中的char s[]和char *s有什么区别
考虑c中的两个表述,两者的区别是什么?
char s[] = "geeksquiz";
char *s = "geeksquiz";
以下是主要的区别:
语句’ char s[] = ” geeksquiz ” ‘创建一个字符数组,它和其他数组一样,我们可以进行所有数组操作。这个数组唯一特殊的地方是,虽然我们初始化了9个元素,但它的大小是10(编译器会自动添加’ \0 ‘)
#include <stdio.h>
int main()
{
char s[] = "geeksquiz";
printf("%lu", sizeof(s));
s[0] = 'j';
printf("\n%s", s);
return 0;
}
输出:
10
jeeksquiz
语句’ char *s = ” geeksquiz ” ‘创建一个字符串字面量。字符串字面值被大多数编译器存储在内存的只读部分。C和c++标准说字符串字面值具有静态存储时间,任何修改它们的尝试都会给出未定义的行为。
S只是一个指针,和其他指针一样,存储字符串字面量的地址。
#include <stdio.h>
int main()
{
char *s = "geeksquiz";
printf("%lu", sizeof(s));
// Uncommenting below line would cause undefined behaviour
// (Caused segmentation fault on gcc)
// s[0] = 'j';
return 0;
}
输出:
8
运行上述程序可能也会产生一个警告“警告:从字符串常量到’ char* ‘的转换已弃用”。出现此警告是因为s不是const指针,而是存储只读位置的地址。该警告可以通过指向const的指针来避免。
#include <stdio.h>
int main()
{
const char *s = "geeksquiz";
printf("%lu", sizeof(s));
return 0;
}