(BOOL)strstr() 在 32 位 iOS 设备中失败

(BOOL)strstr() failed in a 32-bit iOS device

我用strstr判断是否包含字符串,然后用结果强转为BOOL类型,例如:

BOOL result = (BOOL)strstr(aString, "test");

当 aString 在 32 位 iOS 设备中包含 "test" 字符串时,有时会出现结果为 NO。但是 strstr(aString, "test") returns 地址正确。

根据架构,BOOL 可能 typedefunsigned char。那只是8位。当您将指针转换为 BOOL 时,您可能只从指针获取低 8 位。如果这些位全为 0,则 BOOL 为假,即使指针不是 NULL (0).

换句话说,不要那样做。

如果您想要一个布尔值,请使用 strstr(aString, "test") != NULL 甚至 !!strstr(aString, "test")

来自 man strstr:

RETURN VALUES:
If s2 is an empty string, s1 is returned; if s2 occurs nowhere in s1, NULL is returned; otherwise a pointer to the first character of the first occurrence of s2 is returned.

所以将它转换为 bool 只是一个火车残骸,只有当 "test" 不在您的测试字符串中时它才为假,否则它会 return 一个指针,它在很多架构都大于 bool(我的系统显示 sizeof(bool)==1),所以你会得到一个截断的答案......
所以你有一个场景,转换为 bool 意味着即使答案是的,你有 1/256 的机会它是 false 因为 bool 只有一个字节

错误地址示例:

  • 0x80754300
  • 0x12414700
  • 0xac348700
  • 等(任何以 0x00 结尾的东西)