我用C編寫了一個小程序,編譯完美並且工作,當我通過我的Makefile
和clang
進行編譯時,然而,在Xcode中,這個函數表現得不像它應該的那樣而鏗鏘無視它)。C strcpy的怪異行爲
size_t getUrlForArgAndPlatform(char **dest, const char *arg, const char *platform) {
int isLinux = strcmp(platform, "Linux");
int isOSX = strcmp(platform, "Darwin");
char *platformUrlDelimiter = malloc(6 + 1);
if (isLinux == 0) {
strcpy(platformUrlDelimiter, "linux");
} else if (isOSX == 0) {
strcpy(platformUrlDelimiter, "osx");
} else {
strcpy(platformUrlDelimiter, "common");
}
int length = (int) strlen(kBaseUrl);
length += strlen(platformUrlDelimiter);
length += strlen(arg);
length += 5;
char *buffer = (char *) malloc(length);
if (buffer == NULL) {
exit(EXIT_FAILURE);
}
strcpy(buffer, kBaseUrl);
strcat(buffer, "/");
strcat(buffer, platformUrlDelimiter);
strcat(buffer, "/");
strcat(buffer, arg);
strcat(buffer, ".md");
*dest = malloc(strlen(buffer) + 1);
strcpy(*dest, buffer);
free(platformUrlDelimiter);
free(buffer);
return strlen(buffer) + 1;
}
它的工作原理4次滿分10分。在其他的6倍,Xcode是告訴我它的失敗在strcpy(*dest, buffer)
一個SIGBRT
。如果我看看調試器,我看到buffer
包含兩次相同的字符串。爲什麼?
Hooray!是的,就是這樣。但爲什麼它不會每次都失敗呢? – Leandros
這是由於*未定義的行爲*的性質。有時候,這樣的錯誤代碼似乎很長一段時間才能正常工作,直到... –