字符串切片时出现未知字符与段错误的问题排查
问题分析与修复方案
核心问题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
相关产品推荐
相关产品推荐

