关于数组中【字符串常量】及【字符数组】的问题
首先给出以下程序:
(大家认为能不能成功运行呢?)
#include<stdio.h>
int main()
{
char *str1="abcde";//str1是一个指针,字符串常量
char str2[]="abcde";//str2为一个字符数组
str1[0]='x';//error,想要修改str1中的第一个元素的值为x
str2[0]='x';//ok,想要修改str2中的第一个元素的值为x
}
运行结果截图:
为什么会使程序崩溃呢???
原因是str1是一个字符串常量,分配的是一个常量地址,也就是说存入str1中的是一个地址,一个常量内存,无法修改!!
str2则可以运行,使用输出语句,运行的结果如下:
str2是一个字符数组,“abcde”是存放于数组中的,str2[0]='x'意思就是把第一个元素替换为x,可见字符数组可以修改。
总结一下!!!
字符串常量是不可修改的~
字符数组在不越界的情况下可以修改!
(以下则展示的是越界情况,会崩溃><)
为了深化理解,再给出以下例子:
//关于数组中字符串常量以及字符数组的问题
#include<stdio.h>
#include<string.h>
int main()
{
char *str1="abcde";//str1是一个指针,字符串常量
char str2[]="abcde";//str2为一个字符数组
strcpy(str1,"xyz");//error,字符常量不可修改
strcpy(str2,"hello word");//error,越界
}
上述 程序调用了库函数strcpy(),也就是复制,但是两次均失败,原因如下:
①str1是一个字符串常量,无法修改值,因此无法进行复制,程序崩溃
②str2所占的字节数为6个字节(如下图),“hello world”越界,程序崩溃
str1是一个指针,内存中存的是地址,占用4个字节
str2是一个字符数组,占用6个字节
总结!!!
在使用字符串常量以及字符数组的时候程序崩溃的原因:
①试图修改字符串的值
②越界
关于安全使用的问题
例如以下程序
#include<stdio.h>
#include<string.h>
int main()
{
char str1[10]={1,2,3};
gets(str1);//gets危险
printf("%s",str1);
}
①未越界,程序执行成功
②越界,程序崩溃
gets()是一个非常危险的函数,曾经因为gets()函数导致过极其严重的问题。
因为gets容易越界,所以建议使用较安全的fgets()
欢迎大家交流这一块的内容呀❤祝大家都能0 error(s),0 warning(s)!!!!!!!!!!