假設我喜歡這樣複製字符串。我可以複製空字符串中的字符串嗎?
char str[] = "";
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str); // "abc"
printf("%d", strlen(str)); // 3
然後,爲什麼它不給我未定義的行爲或導致程序失敗。這樣做的缺點是什麼?
假設我喜歡這樣複製字符串。我可以複製空字符串中的字符串嗎?
char str[] = "";
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str); // "abc"
printf("%d", strlen(str)); // 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函數氣餒的原因之一,而建議使用需要指定相關字符串大小的複製和連接函數。
您正在寫入分配給堆棧中str的內存空間。你需要確保你有足夠的str空間。在你提到的例子,你需要一個空間,b和c加上一個空字符結束的字符串,因此,此代碼應工作:
char str[4];
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str); // "abc"
printf("%d", strlen(str)); // 3
它可以使你不確定的行爲,但你的程序沒有按」因此不得不失敗。這就是未定義行爲的工作原理。
你怎麼知道它不給你不確定的行爲? –
,因爲它給了我正確的字符串長度。 –
[未定義的行爲意味着任何事情都可能發生](http://blogs.msdn.com/b/oldnewthing/archive/2011/09/29/10217910.aspx) – phihag