【问题标题】:test if strstr return a valid pointer测试 strstr 是否返回有效指针
【发布时间】:2013-03-26 18:06:43
【问题描述】:

我正在尝试像这样使用 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. 原点: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 

在此之后,我尝试测试指针是否为空。 这是我现在的问题,如何解决?

最好的问候!

【问题讨论】:

  • 看起来不像在这段代码中。你确定strstr的参数有效吗?
  • 您确定错误发生在if 行吗?
  • 如果您收到来自 strstr() 的访问冲突,则您传入的地址无效,或者它们引用的字符串未终止。我建议你验证这两个条件之前 断定上述代码有问题。
  • 是的,我正在调试代码,它发生在 if 行。
  • strstr 的参数有效。字符串 chave 已在函数范围内正确初始化,并且在其他时间使用 origem 并且在这些时间可以正常使用。

标签: c visual-studio-2010


【解决方案1】:

无法复制您的错误。这是我尝试过的:

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: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。 middle.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

即使两个命令行基本相同,我仍然没有收到错误。我不知道该说什么,对不起。

【讨论】:

  • 但这正是我正在做的。我注意到的一些是 VS2010 中的 c 编译器是 C89。这有什么问题吗?
  • 如果您可以查看您的项目设置并发布 C/C++ 和链接器的命令行,也许会对我有所帮助。我可以将它们作为我的来输入,以确保我正在像你一样建造。
  • 我也尝试过,但我相信它没有用!我什至在 else 语句中加上 printf("没有找到") 并打印出来。
  • 命令行为: /ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_D​​EBUG" /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
  • 祝你好运。需要注意的一件事:您的项目正在为 UNICODE 构建,但您使用的 char 可能不可移植,如果您在 ASCII 字符串上使用 UNICODE 函数,某些字符串函数可能无法正常工作,反之亦然。
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 2010-10-07
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
相关资源
最近更新 更多