2011-02-14 56 views
2

我有一個非常簡單的程序,但是這給了我一個seg故障。我一直在努力解決這個問題。請幫忙。std ::用指針交換給出了分段錯誤

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

main() { 
char *database; 
int ndata=4; 
database="aaa4baa3bcd2aab5"; 
char *dummy; 
dummy=(char *)malloc(16); 
memcpy(dummy,database,16); 
printf("%s\n",dummy); 
std::swap(database,dummy); 
dummy[2]='a'; 
} 

在交換工作正常之前分配到虛擬變量。交換後有什麼問題。 感謝

回答

1

我會重寫你的代碼有點不改變其含義

char *database = "aaa4baa3bcd2aab5"; 
char *dummy = (char *)malloc(16); 
memcpy(dummy,database,16); 
printf("%s\n",dummy); 
std::swap(database,dummy); 
dummy[2]='a'; //here you in fact attempt to modify a string literal 

你做了之後swapdummy點,其中database前面所指出,這就是一個字符串文字,你是不允許修改的地址。

此外請注意,字符串文字有16個字符加上一個空終止符 - 總共17個字符,所以一旦你分配了大小爲16的緩衝區並複製了文字,那麼結果不是空終止。

3

database指向一個字符串文字,它被放入只讀存儲器,你不能寫,即使指針char *,而不是const char*類型。嚴格地說,文字是const char *類型,並且對char *類型指針的分配應該是不允許的,但這是今天仍然允許的遺留隱式轉換。

swap只交換指針本身,而不是它們指向的內容。因此,在swap之後,虛擬指的是包含字符串文字的內存,不允許您寫入。

也許你應該考慮使用std::string作爲你的字符串處理,它允許簡單的賦值等,從而允許swap按照你的預期工作。

+0

+1,來自`char const *`的`char *`真的很煩人......使用`string`! – 2011-02-14 14:20:12

0

字符串文字是不可變的,而嘗試修改該字符串可能會導致運行時失敗。儘管語言允許char*指向字符串,但在這種情況下,您應該始終標記指針對象常量:const char* database = "aaa4baa3bcd2aab5";

如果這樣做,編譯器會通知您不能交換這些指針(因爲現在它們的類型不兼容),從而避免了查找運行時錯誤的麻煩。


除此之外,不應將dummy作爲字符串打印,因爲它不是空終止的。

0

數據庫包含17個字符:16個數加上最後的'\ 0'。你只複製前16個,所以虛擬不包含最後的'\ 0'。

因此printf("%s\n",dummy);將讀取過去的虛擬結束,並可能訪問內存不允許讀取。