新聞速報

        

2014年3月3日 星期一

C 的字串...char* 和 char[]

#include <stdio.h>
 
char test1[]="Charlie";
char *test2="Richard";
 
int main(void)
{
   printf("%s\n",test1);
   printf("%s\n",test2);
   strcpy(test1,"test1");
   //strcpy(test2,"test2"); //這行可以compiler過,不過程式執行會當在這
   printf("%s\n",test1);
   printf("%s\n",test2);
   return 0;
} 
 
char test1[]="Charlie"; 配置剛好的記憶體空間,並且從literal constant區域複製字串內容過來,而test1只是個常數,代表這個配置空間的第一個位置
 
char *test2="Richard"; 配置一個指標變數,並且複製literal constant區域內某字串的第一個位置值,所以*test2指向literal constant這個區域,由於唯讀,所以對其修改會產生Access violuation....
 
另外這些區域的保護作用,也不是編譯器說了算,是要OS(認出來做處裡)和CPU(的機制)互相配合,才可以實現....
若是某些embedded system的情境下,有可能是literal constant的區域(section)是放在唯讀記憶體(或flash),所以無法寫入,或者寫也寫不進,如果經過適當的處理(Relocate 和適當的搬移),把literal constant區域複製到RAM上,則存取就沒問題了








沒有留言:

張貼留言