C中的char s[]和char *s有什么区别?

2021年4月19日12:13:30 发表评论 851 次浏览

考虑下面的C中的两个语句。两者之间有什么区别?

char s[] = "geeksquiz";
   char *s  = "geeksquiz";

以下是主要区别:

C中的char s []和char * s有什么区别?1

语句"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;
}

本文由Abhay Rathi提供。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: