You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中NSLog打印特殊转义字符串触发EXC_BAD_ACCESS崩溃原因咨询

为什么直接用NSLog打印含%的URL字符串会触发EXC_BAD_ACCESS崩溃

核心原因是NSLog是C风格的格式化输出函数,它会把第一个参数当作「格式控制字符串」来解析,字符串里的%是占位符标记,而非普通字符。

具体崩溃逻辑:

  • 当你执行NSLog("%3A%2F%2F%2F%2F%2F%3F%3D%2k%3D%2s%3D")时,NSLog会逐段解析字符串中%开头的片段:
    • %3A会被识别为格式占位符的一部分(%3是无效的宽度指定,后续的A也不是合法格式符),但还未触发崩溃;
    • 致命错误出现在%2s:这会被解析成「宽度为2的C字符串占位符」,按照NSLog的规则,它会去栈中读取对应的C字符串参数,但你根本没传任何额外参数,直接导致程序访问非法内存地址,触发EXC_BAD_ACCESS崩溃;
    • 同理,%2k也是完全无效的格式说明符,同样会让NSLog错误地尝试读取不存在的参数,引发内存异常。

为什么用NSLog("%@", urlStr)就能避免:

当你把%@作为格式串、urlStr作为第二个参数传入时,NSLog会把%@当作「Objective-C/Swift对象占位符」,直接读取传入的urlStr对象并打印其内容——此时urlStr里的%只是普通字符,不会被当作格式占位符解析,自然不会触发崩溃。

内容的提问来源于stack exchange,提问作者SunnyJ_CN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:02:41