0

次のように strstr 関数を使用しようとしています。

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

予想に反して、"if" テストを実行すると、コンパイラはアクセス位置違反の例外をスローします。文字列から存在しないキーワードを取得しようとするたびに発生します。

コール スタックは次のとおりです。

    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. chave: 0x00196f64 "$GNGSA" type:char *
  2. Origem: 0x00196840 "$GPRMC,000651.082,V,,,,,,191210,,,N*4F $GPGGA,000652.091,,,,,0,00,,,M,0.0,M,,0000*5F $ GPGSA,A,1,,,,,,,,,,,,,*1E" type:const char *
  3. pInicio: 0x00000000 無効 > type:const char *

リンカー コマンド ラインは次のとおりです。

/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 

この後、ポインタがnullかどうかをテストしようとします。それが今の私の問題なのですが、どうすれば解決できますか?

よろしくお願いします!

4

1 に答える 1

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 "_D​​EBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc / に設定します。 RTC1 /GS /fp:正確 /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='asInvoker' 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

両方のコマンド ラインが本質的に同じであっても、まだエラーが発生しません。何を言いたいのかわかりません、ごめんなさい。

于 2013-03-26T20:27:44.903 に答える