这篇博客总结字符串崩溃的原因
首先 eg:
char *str1='abcde';//字符串常量,常量不允许修改,占4字节,若abcde的地址为1000,4个字节只保存他的地址,无法放abcde
char str2[]='abcde';//字符数组,占6字节,a,b,c,d,e,\0,自己创建的可以修改里面的值
str1 [0]='x';//写错误,把'x'改成了'a',因为字符串常量无法修改,所以崩溃
strcpy (str1,"xyz");//str1是常量,放一个都崩溃,放xyz同样崩溃,常量是不允许修改的
strcpy(str2,"Hello,world!");//同样崩溃,原因是越界,本只有6字节,但Hello,world有12个字节,内存不够,所以崩溃
因此,总结出了字符串崩溃的两个原因:
1.试图修改字符串常量的值
2.越界(内存不够)
eg:
#include <stdio.h>
#include <string.h>
int main()
{
char str1 [10];
gets (str1);//gets是一个极危险函数(容易出现越界),建议使用fgets(安全版本),只要出现危险,就是越界问题。
printf ("str1=%s\n‘’,str1);
eg:
#include <stdio.h>
#include <string.h>
int main()
{
char str1 [100] = "abcde";//100,5
char str2 [] = "abcde";//6,5(字符串里还有\0)
char str3 [100] ="abcdef\0ijk\n";//100,6(字符串有效长度遇到\0就停止)
char str4 [] ="abcdef\0ijk\n";//12,6
char *str5 = "abcde";//4,5(为字符串常量,无法修改,指针4字节)
char *str6 = "abcdef\0ijk\n";//4,6(指针4字节,字符串有效长度遇到\0就停止)
printf("%d,%d\n",sizeof(str1),strlen(str1));
printf("%d,%d\n",sizeof(str2),strlen(str2));
printf("%d,%d\n",sizeof(str3),strlen(str3));
printf("%d,%d\n",sizeof(str4),strlen(str4));
printf("%d,%d\n",sizeof(str5),strlen(str5));
printf("%d,%d\n",sizeof(str6),strlen(str6));
return 0;
}