2013-07-11 174 views
1

假設我喜歡這樣複製字符串。我可以複製空字符串中的字符串嗎?

char str[] = ""; 
char *str2 = "abc"; 
strcpy(str, str2); 
printf("%s", str); // "abc" 
printf("%d", strlen(str)); // 3 

然後,爲什麼它不給我未定義的行爲或導致程序失敗。這樣做的缺點是什麼?

+6

你怎麼知道它不給你不確定的行爲? –

+0

,因爲它給了我正確的字符串長度。 –

+1

[未定義的行爲意味着任何事情都可能發生](http://blogs.msdn.com/b/oldnewthing/archive/2011/09/29/10217910.aspx) – phihag

回答

3

此代碼肯定會導致堆棧問題,儘管有這麼小的字符串,但您沒有看到問題。舉個例子來說,以下幾點:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
     char str[] = ""; 
     char *str2 = "A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string."; 
     strcpy(str, str2); 
     printf("%s\n", str); 
     printf("%d\n", strlen(str)); 
     return 0; 
} 

一個人爲的例子,是的,但運行此的結果是:

A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string. 
92 
Segmentation fault 

這就是爲什麼strcpy函數氣餒的原因之一,而建議使用需要指定相關字符串大小的複製和連接函數。

4

您正在寫入分配給堆棧中str的內存空間。你需要確保你有足夠的str空間。在你提到的例子,你需要一個空間,b和c加上一個空字符結束的字符串,因此,此代碼應工作:

char str[4]; 
char *str2 = "abc"; 
strcpy(str, str2); 
printf("%s", str); // "abc" 
printf("%d", strlen(str)); // 3 
2

它可以使你不確定的行爲,但你的程序沒有按」因此不得不失敗。這就是未定義行爲的工作原理。

相關問題