2013-08-29 122 views
0

我遇到了一個奇怪的字符串大小問題。這是我的示例代碼C++奇怪的字符串大小

sampleA

std::string getexepath() 
{ 
    char result[ PATH_MAX ]; 
    int found; 
    ssize_t count = readlink("/proc/self/exe", result, PATH_MAX); 
    found = std::string(result).find_last_of("/"); 
    std::string pp = std::string(result).substr(found+1); 
    std::string kk = std::string(result).substr(found+1); 
    std::cout << kk << kk.size() << std::endl; 
    return kk; 
} 

sampleB

std::string getexepath() 
{ 
    char result[ PATH_MAX ]; 
    int found; 
    ssize_t count = readlink("/proc/self/exe", result, PATH_MAX); 
    found = std::string(result).find_last_of("/"); 
    //std::string pp = std::string(result).substr(found+1); 
    std::string kk = std::string(result).substr(found+1); 
    std::cout << kk << kk.size() << std::endl; 
    return kk; 
} 

的輸出是不同的; sampleB輸出比sampleA多2個字符。我猜想區別是'\0'; sampleB輸出包括'\0',而sampleA不包含。

我想知道是什麼原因造成的問題。 審查答案後,現在我知道我錯過了'\ 0'。但我仍然想知道爲什麼添加此語句「std :: string pp = std :: string(result).substr(found + 1)」將導致不同的結果。

謝謝

+2

['readlink()'](http://linux.die.net/man/2/readlink)的文檔聲明:「readlink()不會向buf追加空字節。」所以我很好奇。在使用它構造'std :: string'之前,注意所描述的功能並設置'result [count] = 0;'*是否有意義? (假設你實際檢查結果不是(-1),你現在*不*這樣做)。 – WhozCraig

+0

文本'sampleA'和'sampleB'是否字面上出現在您的代碼中? – user2357112

+1

難道你真的不想設置'result [count]',並且使緩衝區1字符變大嗎? – user2357112

回答

2

你猜對了。問題是你忘了設置result[count]=0。因此,您的代碼具有未定義的行爲,因爲char數組result未以'\ 0'結尾。

在添加

result[count] = 0; 

found = ...之前,你會得到兩個樣品A和樣品B.相同的結果

+0

你說得對。在添加結果[count] ='\ 0'後,SampleA和B具有相同的輸出。但我仍然想知道爲什麼這個語句「std :: string pp = std :: string(result).substr(found + 1)」總是讓A和B有區別? – cppython

+0

我相信行爲是依賴於實現的,因爲我使用gcc 4.4.5來運行它,它給出了不同的大小,但是與Solaris CC一樣,它給出了相同的大小。 –

1

result[ PATH_MAX ]棧上的內存未初始化,這樣的內容結果是不確定的。像WhozCraig的評論:

readlink()不向buf追加空字節。

因此'\ 0'可能出現在result[ count-1 ]之後的每個地方,並且代碼中的輸出未定義。當聲明C格式字符串時,我們最好像這樣初始化字符串:char result[ PATH_MAX ] = {0};。希望這些可以幫助你。