char*s = “hello world” 是否是字符串?

  用C/C++的老铁们可能对这个都比较熟悉。char* s = "Hello World";这样定义字符串很简单呀,很方便。不用去考虑大小呀什么的,简单快捷。是,这样子是挺方便,并且编译也不会报错会经过,程序也能跑,可是实际上,这样子作是很差的,严格意义上来说,这样实际上是定义了一个野指针。下面咱们就用一段代码来阐述这件事情。数组

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()  5 {  6 
 7     char* s = "hello world";  8     char* s1 = "hello world";  9     printf("s = %s\n", s); 10     printf("s1 = %s\n", s1); 11     printf("addr_s = %p\n", s); 12     printf("addr_s1 = %p\n", s1); 13 }

  咱们按照这种方式定义了两个“字符串”,咱们经过printf函数看一下这个字符串可否正常的输出,而且咱们也看一下s和s1在内存中的地址。安全

  

  最终咱们看到虽然程序报了两个warning,可是程序依然能够继续运行。经过程序的输出咱们能够看到,s和s1都可以正常的输出咱们想要的hello world字符串。可是有一个地方值得注意,s和s1拥有着相同的地址。那么是否是全部的字符串都是这样的呢,咱们换一种方式去定义。函数

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()  5 {  6 
 7     char* s = "hello world";  8     char* s1 = "hello world";  9     printf("s = %s\n", s); 10     printf("s1 = %s\n", s1); 11     printf("addr_s = %p\n", s); 12     printf("addr_s1 = %p\n", s1); 13     char s2[12] = "hello world"; 14     char s3[12] = "hello world"; 15     printf("s2 = %s\n", s2); 16     printf("s3 = %s\n", s3); 17     printf("addr_s2 = %p\n", s2); 18     printf("addr_s3 = %p\n", s3); 19     
20 }

  咱们经过数组的形式又去定义了两个字符串,这下咱们再去看一下程序的输出。spa

  

  咱们看到,此次s2和s3并没具备相同的地址,并且值得注意的是,s、s1和s二、s3的内存地址相差较大。这是为何呢?其实这是由于char* s = "hello world",这个操做是操做系统帮你完成的。本事char*s是一个野指针,咱们并不知到“hello world”这个内容在哪,可是却让一个指针去指向它。那么不知道该指向谁的指针要怎么作呢?操做系统就会在特定的一个区域去帮它建立出这样的一块内存去存放“hello world”而后让这个指针去指向它。并且这块特殊的内存并非属于程序自己的,而是属于操做系统的,那么这样就会形成你只能够去读这块区域,他不会容许你去修改这一块区域。这就是操做系统的保护机制,任何操做系统都是这样。操作系统

  因此咱们在定义字符串的时候就要有所考虑,何时用char* s 这样的字符串,何时用char s[12]这样的字符串。简单的说,若是你只是定义了一个字符串,后来并不会对他进行一些操做,那么你能够用这种char* s形式字符串,或者你想定义一个函数去接收一个字符串类型的参数也能够用这种字符串。若是想要后续的对字符串进行大量的操做,最好用数组类型的字符串,由于它不会去占用系统的内存,这样你就对这个字符串拥有了相对较高的权限。指针

  因此char* s是一个字符串,只不过是一种权限比较低的字符串,它的使用并不安全,也并不完美——由于相同的字符串会占用同一个内存地址,因此在使用的过程当中要多加考虑。code

相关文章
相关标签/搜索