1. 程式人生 > >字串崩潰原因

字串崩潰原因



//字串崩潰原因:
//①試圖修改字串常量的值   ②越界
//[四個位元組【存放的只是abcde的地址】] char *str1 = "abcde";   //稱為 字串常量 (不能修改字串常量的值)
//[六個位元組,包括‘\0’【存放的都是自己定義的,可以修改】] char str2[] = "abcde";   //稱為 字元陣列 (有\0 所以也是字串)

/*
#include <stdio.h>
int  main()
{
 char *str1 = "abcde";
 char str2[] = "abcde";
 //str1[0] = 'x';   //error,因為寫錯誤,即不能修改字串常量的值 ①
 str2[0] = 'x';

 //strcpy(str1,"xyz");   //error,因為寫錯誤,即不能修改字串常量的值 ②
 //strcpy(str2,"hello world");   //error,因為越界

 printf("%s\n",str1);
 printf("%s\n",str2);
 return 0;
}
*/


/*
int main()
{
 char str1[10];
 gets(str1);   //危險,越界,建議使用fgets
 printf("str1 = %s\n",str1);
 return 0;
}
*/


//例:
#include <stdio.h>
#include <string.h>
int main()
{
 char str1[100] = "abcde";   //100,5
 char str2[] = "abcde";   //6,5
 char str3[100] = "abcdef\0ijk\n";   //100,6   //結果中的6   是因為strlen計算時到\0停止
 char str4[] = "abcdef\0ijk\n";   //12,6
 char *str5 = "abcde";   //4,5                 //結果中的4   是因為* 四個位元組【存放的只是地址】
 char *str6 = "abcdef\0ijk\n";   //4,6         //結果中的4   是因為* 四個位元組【存放的只是地址】
 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;
}