程序触发segmentation fault错误,求分析原因及修复方案
Segmentation Fault 错误原因分析
以下是导致程序触发段错误的核心问题:
1. 结构体内存分配错误
在read_slaves_file函数中,分配结构体指针时犯了低级错误:
struct Slave *slave_ptr = malloc(sizeof(struct Slave *));
这里只分配了结构体指针的大小(通常是4或8字节),但实际需要分配整个struct Slave的内存空间。正确写法应为:
struct Slave *slave_ptr = malloc(sizeof(struct Slave));
错误的分配会导致后续访问结构体成员(如slave_ptr->RSSI)时内存越界,直接触发段错误。
2. RSSI函数中二级指针未正确初始化
RSSI函数返回int**类型,但仅为外层指针分配了内存,内层的每个rssi_value[k]都未指向有效的int内存:
int **rssi_value = malloc(sizeof(int *) * 128); // ... rssi_value[k] = atoi(token);
这里把atoi返回的整数直接赋值给int*类型变量,相当于把整数当成内存地址存储。后续访问slave_1->RSSI时,会尝试访问非法内存地址,必然触发段错误。
实际上每个样本只需要存储一个RSSI整数值,完全不需要二级指针,改用int*即可:
int *RSSI(char **last_samples) { int *rssi_value = malloc(sizeof(int) * 4); // 对应4个样本 // ... rssi_value[k] = atoi(token); // ... }
同时结构体中的int **RSSI;也要同步改为int *RSSI;。
3. last_samples的元素未分配内存
在read_slaves_file中,仅为last_samples分配了指针数组的内存,但每个last_samples[k]都未指向有效的字符串缓冲区:
char **last_samples = malloc(4 * sizeof(char *));
直接将这样的野指针传给RSSI函数中的strcpy,会导致访问未初始化的内存,触发段错误。必须为每个last_samples[k]分配足够的内存来存储读取到的字符串。
4. 依赖固定token索引的潜在风险
RSSI函数中通过i == 5定位RSSI值,完全依赖输入字符串的固定格式。如果某条日志的字段数量或顺序变化,会导致token遍历不完整,甚至出现越界访问,进一步加剧内存错误。
内容的提问来源于stack exchange,提问作者user14677223
相关产品推荐
相关产品推荐

