考虑下面的C中的两个语句。两者之间有什么区别?
char s[] = "geeksquiz";
char *s = "geeksquiz";
以下是主要区别:
语句’ char s [] =“ geeksquiz” ‘创建一个字符数组,该数组与其他数组一样,我们可以执行所有数组操作。关于此数组的唯一特殊之处在于,尽管我们已使用9个元素对其进行了初始化,但其大小为10(编译器会自动添加’\ 0’)
#include
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
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
int main()
{
const char *s = "geeksquiz";
printf("%lu", sizeof(s));
return 0;
}
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。