【发布时间】:2023-04-04 10:47:01
【问题描述】:
我编写了一个代码来帮助从特定字符串中提取数据。 示例:如果字符串是“ABCD*” 该代码将帮助我定义“*”之前最后一个字符的索引
char *magicchar;
int IndexofMagicchar =0;
magicchar=strchr(InputData,"*");
IndexofMagicchar = (int)(magicchar - InputData);
现在代码可以正常工作,直到您使用不包含“*”的 InputData,然后服务将崩溃。 解决方法只是在 magicchar 变量上添加一个简单的测试:
char *magicchar;
int IndexofMagicchar =0;
magicchar=strchr(InputData,"*");
if (magicchar!=NULL)
IndexofMagicchar = (int)(magicchar - InputData);
我的问题是,即使输入不包含“*”,代码也能正常工作,为什么崩溃会变得系统化?
【问题讨论】:
-
请edit您的问题提供一个minimal reproducible example,可用于重现问题。
-
首先
strchr(InputData, "*")是错误的。strchr的第二个参数是 int。正确的调用应该是strchr(InputData, '*')。 -
您是否更改了编译器?编译开关?操作系统?程序中的其他代码?许多事情都会影响这一点。如果程序布局发生变化,
IndexOfMagicchar的计算可能会导致较大的正值,而不是您测试的负值。如果编译器发生更改,则在返回空指针时未定义magicchar - InputData的事实可能会导致优化器以导致崩溃的方式转换您的程序。 -
当您将指针不是
char传递给strchr时,该程序一直无法正常工作 -
您没有收到
magicchar=strchr(InputData,"*");的编译器警告?警告是否开启?
标签: c string compiler-errors crash segmentation-fault