我的程序中有一个segmentation fault
错误。这是代码:首先,我有一个结构:
struct Slave
{
char **all_samples;
int number_of_samples;
char **last_samples;
int **RSSI;
int *AGC;
int *AUTH;
};
然后我有一个函数:(解窃我确定当我调用RSSI function
时会发生分段错误)。all_samples
和last_samples
是 2 个数组。第一个包含N
字符串(N
是可变的),而第二个肯定包含 4 个字符串。
struct Slave *read_slaves_file(char *file_path, char *slave)
{
...
char **all_samples = malloc(N * sizeof(char *));
char **last_samples = malloc(4 * sizeof(char *));
struct Slave *slave_ptr = malloc(sizeof(struct Slave *));
slave_ptr->last_samples = last_samples;
slave_ptr->all_samples = all_samples;
slave_ptr->number_of_samples = i;
slave_ptr->RSSI = RSSI(slave_ptr->last_samples);
return slave_ptr;
}
这是RSSI function
: 它只是解析一个字符串以提取-RSSI
单词后面的数字。例如:
2022-10-14 8:51:17:708 -IP 192.168.101.11 -RSSI 88367 -AGC 429496720 -AUTH 0
它提取88367
.它适用于像这样的 4 个字符串。
int **RSSI(char **last_samples)
{
int **rssi_value = malloc(sizeof(int *) * 128);
char string[128];
const char s[16] = " ";
char *token;
int i;
for (int k = 0; k < 4; k++)
{
strcpy(string, last_samples[k]);
token = strtok(string, s);
i = 0;
while (token != NULL)
{
if (i == 5)
{
rssi_value[k] = atoi(token);
}
i++;
token = strtok(NULL, s);
}
}
return rssi_value;
}
进入main.c
:
#include "lib.h"
int main()
{
while (true)
{
...
struct Slave *slave_1 = read_slaves_file(FILE_PATH, SLAVE_1);
free(slave_1->last_samples);
free(slave_1->all_samples);
free(slave_1->RSSI);
free(slave_1);
usleep(1000*1000);
}
return 0;
}
此内存分配已无效
struct Slave *slave_ptr = malloc(sizeof(struct Slave *));
^^^^^^^^^^^^^^
你需要写
struct Slave *slave_ptr = malloc(sizeof(struct Slave));
^^^^^^^^^^^^^^
或
struct Slave *slave_ptr = malloc(sizeof( *slave_ptr ));
^^^^^^^^^^^^^
也在这个 for 循环中
for (int k = 0; k < 4; k++)
{
strcpy(string, last_samples[k]);
//...
strcpy
的调用使用未初始化的指针last_samples[k]
。
而这句话
rssi_value[k] = atoi(token);
也是不正确的。尝试使用整数初始化指针。