2014-09-22 80 views
-6

我使用一個64位linux機器,所以我的指針的大小是8個字節,所以看下面的代碼,我寫了下面的程序段落H在我的字符串(在strcpy())。但似乎並沒有發生。在下面的程序中,我認爲它會溢出並破壞x中的內存。這下面的程序在我的系統上運行良好,但如果我在strcpy()中添加另一個字母,它會出現段錯誤。所以這樣的問題顯然與系統有關,但是這個字符串是如何不使程序崩潰的呢?我確實在尋找這樣一個問題,如果有一些鏈接存在,你也可以指導我。提前致謝。如何在C中處理字符串?

int main() 
{ 

int x; 
char* c ; 

x = 0xF0000000; 

strcpy(&c,"ABCDEFGHFFFFFF"); 
x++; 
printf("%X\n",x); 

printf("%s\n",&c); 

}

+4

我看到你已經聲明瞭一個指針......但它指向什麼? – 2014-09-22 20:48:08

+0

當然它要和警告編譯,但它確實給我一個輸出爲以下 'F0000001 ABCDEFGHFFFFFF' 我現在這肯定你如何寫常規程序,我只是想看看字符串被複制,你是大家一定沒有答案。 – 2014-09-22 20:52:19

+0

你的程序簡直就是UB,沒什麼有用的爭論。如果你想知道在特定運行情況下你的情況究竟是什麼,請將調試器分解出來並單步執行。請注意,使用調試器可能會改變程序行爲。 – Deduplicator 2014-09-22 20:54:42

回答

0

作爲在C指針和內存管理:

  • 必須手動創建指針
  • 你必須分配內存手動
  • 你必須初始化指向手動指向分配的內存的指針

表達

char *c; 

只創建指針,但它也不分配用於字符的任何存儲器,也沒有指針它初始化到所分配的內存。

你用好得多:

char c[20]; 

c會像一個指針,但在同一時間,你已經分配一個20字節的緩衝區(在main的堆棧幀)和c正指向它的開始。

當使用字符串(字符指針),你不strcpy指針的地址,而是通過指針持有地址:

strcpy(c, "ABCDEFGHFFFFFF"); 

正如一個側面說明:表達"ABCDEFGHFFFFFF"分配一個常量字符緩衝區,包含文本文本和內存中的終止零並返回其地址。這就是爲什麼這種用法是合法的。