2011-02-01 64 views
0

我只是試圖連接C中的兩個字符串,我不知道爲什麼,但我得到段錯誤。我使用gdb將其追蹤到下面代碼行的第一行。這段代碼試圖連接C中的字符串有什麼問題?

strcat(tempString, "uptime"); 
    pFile = fopen (tempString,"r"); 

tempString is =「/ proc /」。我只想將字符串「uptime」附加到tempString,然後嘗試打開文件(如果它存在於/ proc文件夾中)。當memcat()被strcat()調用時,實際發生段錯誤。

+2

你是否正確地分配了`tempString`? – John 2011-02-01 19:24:05

+0

最初沒有,但現在我把它切換到字符tempString [80],它似乎工作。 – ihtkwot 2011-02-01 19:42:10

回答

6

您還沒有表現出這些行之前的一些代碼,但它很可能tempString使用

tempString = "/proc/"; 

這使它成爲一個常數(恆定MEM大小分配)
第二行strcat將atempt來分配覆蓋字符串常量,將超出緩衝區的6個字節置於未知區域(*如果成功)。

使用strcat的負責任:http://beej.us/guide/bgc/output/html/multipage/strcat.html

*爲JeremyP指出,如果它指向的文本段,它是隻讀的,會導致段錯誤

+5

實際上,如果你對聲明的假設是正確的(我確定它是這樣),那麼tempString指向文本段中的一個位置,它很可能是隻讀的。這可能是seg故障的原因。 – JeremyP 2011-02-01 19:27:41

2

這將有助於明確的東西,如果你向我們展示了該行定義了tempString。但是,它看起來像你有類似char * tempString = "/proc/";,並試圖修改它。由於它是一個帶引號的字符串,因此您可能會也可能不會對其進行修改,如果您嘗試,則可能會出現分段錯誤。 (此外,"/proc/"就是七char長,並添加任何東西到年底將覆蓋或其他東西。)

對於修改字符串,你需要有自己的緩存,分配無論是在堆棧或堆上,並你需要確保它足夠長。