2013-03-26 9 views
0

我試圖使用功能的strstr像這樣:測試返回的strstr有效的指針

const char * pInicio = strstr(origem, chave);  
if (pInicio != NULL) ... 

出乎預期的,當我做「如果」測試編譯器會拋出一個訪問位置衝突異常。每次嘗試獲取某個字符串中不存在的關鍵字時都會發生。

調用堆棧是:

ntdll.dll!779315de()  
    [Os quadros abaixo podem estar incorretos e/ou ausentes, nenhum símbolo foi carregado para ntdll.dll] 
    ntdll.dll!779315de()  
    ntdll.dll!7792014e()  
> msvcr100d.dll!_output_l(_iobuf * stream, const char * format, localeinfo_struct * plocinfo, char * argptr) Linha 2361 + 0xa bytes C++ 
    cccccccc() 

產量爲:

Exceção de primeira chance em 0x0f8620a7 (msvcr100d.dll) no TestesApp.exe: 0xC0000005: Violação de acesso ao ler o local 0x00000001. 
Exceção sem-tratamento em 0x779315de no TestesApp.exe: 0xC0000005: Violação de acesso ao ler o local 0x00000001. 

右鍵異常之前,變量值分別爲:

  1. 蔡夫:0x00196f64 「$ GNGSA」鍵入:char *
  2. Origem:0x00196840「$ GPRMC,000651.082,V ,,,,,,, 19 1210 ,,, N * 4F $ GPGGA,000652.091 ,,,,, 0,00 ,,, M,0.0,M ,, 0000 * 5F $ GPGSA,A,1 ,,,,,,,,,,,, ,,, * 1E」類型:常量字符*
  3. pInicio:00000000無效>類型:常量字符*

鏈接器命令行是:

/OUT:"C:\Users\Leandro\documents\visual studio 2010\Projects\TestesApp\Debug\TestesApp.exe" /INCREMENTAL /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Debug\TestesApp.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\Leandro\documents\visual studio 2010\Projects\TestesApp\Debug\TestesApp.pdb" /SUBSYSTEM:CONSOLE /PGD:"C:\Users\Leandro\documents\visual studio 2010\Projects\TestesApp\Debug\TestesApp.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE 

也是C/C++命令行是

/ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug\TestesApp.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /analyze- /errorReport:queue 

在此之後,我嘗試測試指針,如果它爲空。 那是我現在的問題,該如何解決?

此致敬禮!

+1

看起來不像它在這個代碼中。你確定'strstr'的​​參數是有效的嗎? – 2013-03-26 18:08:22

+0

你確定錯誤發生在'if'行嗎? – Barmar 2013-03-26 18:09:53

+1

如果您從strstr()獲得訪問衝突,您傳入的地址無效,或者它們引用的字符串未終止。我建議你在*結論上面的代碼有問題之前驗證兩個條件*。 – WhozCraig 2013-03-26 18:20:12

回答

2

無法複製您的錯誤。以下是我嘗試的:

int main(int argc, char **argv) 
{ 
    char * chave = "$GNGSA"; 
    const char * origem = "$GPRMC,000651.082,V,,,,,,,191210,,,N*4F $GPGGA,000652.091,,,,,0,00,,,M,0.0,M,,0000*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E"; 
    const char * pInicio = strstr(origem, chave); 
    if (pInicio != NULL) 
    { 
     printf("found it\n"); 
    } 
    return 0; 
} 

這個編譯和運行Visual Studio 2010時沒有錯誤。順便說一下,它找不到匹配項。我接受關於如何調整它以創建錯誤的說明。

- 編輯 -

集編譯器命令行到:/ ZI/NOLOGO/W3/WX-/ OD/Oy-/d 「WIN32」/ d 「_DEBUG」/ d 「_CONSOLE」/ d 「_UNICODE」/ D「UNICODE」/ Gm/EHsc/RTC1/GS/fp:precise/Zc:wchar_t/Zc:forScope /Fp"Debug\odt.pch「/ Fa」Debug \「/ Fo」Debug \ Fd「Debug \ vc100.pdb」/ Gd/analyze-/errorReport:隊列

鏈接器命令行:/OUT:"E:\code\odt\Debug\odt.exe「/ INCREMENTAL/NOLOGO」kernel32.lib 「」user32.lib「」gdi32.lib「」winspool.lib「」comdlg32.lib「」advapi32.lib「」shell32.lib「」ole32.lib「」oleaut32.lib「」uuid.lib「」odbc32.lib 「」odbccp32.lib「/ MANIFEST/ManifestFile:"Debug\odt.exe.intermediate.manifest」/ ALLOWISOLATION/MANIFESTUAC:「level ='asInvoke r'uiAccess ='false'「/ DEBUG /PDB:"E:\code\odt\Debug\odt.pdb」/ SUBSYSTEM:CONSOLE /PGD:"E:\code\odt\Debug\odt.pgd「/ TLBID :1/DYNAMICBASE/NXCOMPAT/MACHINE:X86/ERRORREPORT:QUEUE

即使兩個命令行基本相同,我仍然沒有收到錯誤。我不知道該說什麼,對不起。

+0

但這正是我正在做的。我注意到的一點是VS2010中的c編譯器是C89。這有什麼問題嗎? – 2013-03-26 20:29:44

+0

也許它會幫助我,如果你可以看看你的項目設置併發布C/C++和鏈接器的命令行。我可以像他一樣輸入他們,以確保我像你一樣建設。 – 2013-03-26 20:32:15

+0

我試圖做同樣的事情,並相信它沒有工作!我甚至用printf(「找不到」)放了一個else語句並打印出來。 – 2013-03-26 20:32:52