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

字符串切片时出现未知字符与段错误的问题排查

问题分析与修复方案

核心问题1:字符串缺少终止符导致未定义行为

readSlice函数中,你为切片分配了len字节内存,但未额外分配1字节存储字符串终止符'\0'。printf("%s", s)会持续读取内存直到遇到'\0',这会读到堆内存中的随机数据(即你看到的[?]),属于未定义行为,可能引发后续内存错误。

修复代码:

char * readSlice (char * buf, int pos, int len) {
    char * str = malloc(len + 1); // 多分配1字节存终止符
    memcpy(str, buf + pos, len);
    str[len] = '\0'; // 手动添加字符串终止符
    return str;
}

核心问题2:结构体内存分配错误引发段错误

在ReadString函数中,你写了:

struct MyS * n = malloc (sizeof n);

这里sizeof n计算的是指针变量的大小(通常4/8字节),而非struct MyS结构体本身的大小。分配的内存远小于结构体实际需求,访问n->other[i]时会越界写入堆内存,破坏堆结构,最终触发Segmentation Fault。

修复代码:

struct MyS * n = malloc(sizeof(struct MyS));

同时需确保struct MyS的定义符合需求,比如:

struct MyS {
    int first;
    int other[16]; // 至少包含16个元素,匹配循环范围i<16
};

次要问题:浮点数函数pow的精度风险

pow是浮点数运算函数,处理整数幂时可能存在精度误差,比如pow(10,3)可能返回999.999999,强制转int后变成999,导致数值计算错误。

修复代码(用整数循环替代pow):

int strToInt (char * s, int l) {
    printf("%s\n", s);
    int i = 0;
    int power = 1;
    for (int j = l-1; j >= 0; j--) {
        i += (s[j] - '0') * power;
        power *= 10;
    }
    free(s);
    return i;
}

修复后效果

修正上述问题后,代码会按照预期输出,同时内存管理正常(无泄漏、无非法访问)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:33:15