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

数组索引时出现Runtime error: load of null pointer of type 'char'问题排查

问题分析与修复

核心错误点

  1. 运算符优先级误用:
    代码里的*str[len - 1]和*str[len]写法错误。C语言中数组下标运算符[]的优先级高于间接寻址运算符*,所以str[len-1]会被解析为访问二级指针str的第len-1个元素,而非先解引用str得到字符串指针再访问其下标。正确写法应为(*str)[len - 1]和(*str)[len]。

  2. 前导空格处理的逻辑漏洞:
    原代码while (isspace(**str) || **str == '\0')的条件存在问题。如果字符串一开始为空(**str == '\0'),循环会继续执行++*str,导致指针指向字符串末尾的非法内存区域。后续调用strlen(*str)得到0,此时len - 1等于-1,访问(*str)[-1]必然触发越界访问错误。正确条件应先判断字符串未结束,再检查是否为空格:while (**str != '\0' && isspace(**str))。

修正后的代码

#include <ctype.h>
#include <string.h>

void _JSON_Trim(char **str) {
  // Trim leading whitespace
  while (**str != '\0' && isspace((unsigned char)**str)) {
    ++*str;
  }

  // Trim trailing whitespace
  int len = strlen(*str);
  int trimmed = 0;

  // 避免len为0时的越界访问
  while (len > 0 && isspace((unsigned char)(*str)[len - 1])) {
    --len;
    trimmed = 1;
  }

  if (trimmed) {
    (*str)[len] = '\0';
  }
}

额外说明

  • 调用isspace时将参数转为unsigned char,避免char为有符号类型且字符值在0x80~0xFF范围时,传入负数导致未定义行为。
  • 增加len > 0的判断,即使前导空格处理后字符串为空(len=0),也不会进入后续循环,彻底避免越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:11:06