2009-02-23 70 views
0

我有一個類型爲const char*的C++字符串作爲參數傳遞給strlen,但它返回void。爲什麼strlen()在VC++調試器中返回<void>?

它會像

strlen(astruct.string); 

謝謝..

編輯:做了一些檢查,

strlen("test"); 

仍然給空虛..爲什麼?

編輯:這裏的圖像 http://img14.imageshack.us/img14/1808/strlen.png

對不起不夠明確之前。格式化工作不太好。無論如何,Evan Teran和Vlad Romascanu解決了這個困惑。還要看看Brian R. Bondy的回答。

謝謝。隨時關閉。

+0

你怎麼知道它返回void? – 2009-02-23 03:05:08

+0

你需要定義你的意思是「返回void」,因爲它不能。你張貼的圖片是小到實際查看。 – 2009-02-23 03:14:12

+0

首先,你的圖像是垃圾,以一個體面的分辨率再次採取。其次,添加更多的描述性信息(編譯時或運行時錯誤,您認爲這是錯誤行爲的原因是什麼)。你現在的問題是毫無意義的。不要將char **傳遞給strlen,它需要char *。 – paxdiablo 2009-02-23 03:15:14

回答

3

參考您的屏幕截圖:你的調試器爲strlen(...)顯示<void>的時候,其實它應該顯示錯誤。

您無法調用方法並在調試器監視器中顯示其結果。調試器將只顯示現有的變量和數據。它不能按需調用任意方法,因爲這些方法可以通過代碼的作者或調試器所無法預料的方式改變正在調試的程序的狀態。

你可以做的是,在你的代碼,暫時補充:

size_t tmp_len = strlen(struc.string); 

然後編譯,並添加tmp_len到手錶。

0

strlen返回一個整數,所以我假設你的意思是它返回「0」。另外,你指定你的數據類型的方式,我不能完全知道它是一個const char *還是const char **。如果是後者,那麼你需要確保你將**解除引用到單個*。

我的猜測是,該字符串以空字節開始,這就是爲什麼它返回0。

-2

它不能返回void。無效是缺少一個返回值,所以你不能,錯誤地返回它。

無論如何你怎麼檢查無效?虛空不是一個價值。請證明你是如何失效的。它是編譯時間還是運行時間?

如果您確實有一個系統,其中strlen被聲明爲void返回類型,請儘可能在另一個方向上運行。

4

strlen不是返回類型void,它是你的調試器沒有給出正確的消息。

爲什麼你的debbuger顯示無效?

您正在使用的strlen的實現可能包含了#define strlen someothername_strlen。

調試器可能不支持#define或其他功能上的修飾符。

你將不得不做一些像艾恩= strlen(「測試」),然後檢查你的手錶艾倫。

通常,您可以在手錶中調用功能。例如,嘗試定義以下功能,然後在您的手錶中調用它:

int testFunc(char*) 
{ 
    return 5; 
} 

您的手錶可能會因此得到5。

6

你被visual studio 6.0的蹩腳的調試器弄糊塗了。不要依賴這個。由於內聯或類似情況,它可能無法獲得回報值。

將值打印出來以獲得實際價值。

編輯:另外,從你的例子看來,你可能無法存儲strlen的結果。這也可能是調試器沒有看到返回值的原因。如果不使用該值,編譯器決定不需要實際執行strlen是完全可能的。

注意:在這一點上沒有真正的藉口仍然使用VC++ 6.0。這是一個古老的編譯器和IDE,這是一個令人尷尬的糟糕的C++編譯器。新版本的visual C++編譯器是免費的(沒有IDE),使用它們。

0

在C++中,函數總是返回它們聲明要返回的類型的值。由於strlen函數的聲明看起來是這樣的:

size_t strlen(const char *); 

唯一可以可能返回的是一個size_t。編譯器在編譯時使用這些信息來確定如何在調用函數時處理返回值。這裏的要點是,如果strlen函數聲明如上,它有時不會決定返回void,並且其他時間類型的值爲size_t

這通常是靜態類型語言(如C++)的特徵。在動態類型語言(Perl,Python,Ruby,PHP等)中,函數可以決定在每次調用時返回任何類型的值。

相關問題