关于数组中【字符串常量】及【字符数组】的问题

关于数组中【字符串常量】及【字符数组】的问题

首先给出以下程序:

(大家认为能不能成功运行呢?)

#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)!!!!!!!!!!


猜你喜欢

转载自blog.csdn.net/VVVv_0427/article/details/79943007