char command[] = "/usr/bin/sn_core.elf getstat 2>/dev/null"; char line[MAX_LINE_LENGTH]; float temp; char *Temp[MAX_RECORDS] = {0}; int index = 0; void parse_temperature(char *line) { char *temp_str; char *token; // 解析温度 if ((temp_str = strstr(line, "temp: ")) != NULL) { temp_str += strlen("temp: "); temp = strtof(temp_str, NULL); } } void add_record(float temp) { if (index >= MAX_RECORDS) { free(Temp[0]); memmove(Temp, Temp + 1, (MAX_RECORDS - 1) * sizeof(char *)); index--; } Temp[index] = malloc(sizeof(float)); memcpy(Temp[index], &temp, sizeof(float)); index++; } void print_records() { for (int i = 0; i < index; i++) { printf("温度:%f\n", *((float *)Temp[i])); } } int main() { FILE *fp; while (1) { fp = popen(command, "r"); if(fp = NULL){ printf("Error running command.\n"); exit(1); } while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) { parse_temperature(line); } pclose(fp); add_record(temp); print_records(); sleep(1); } return 0; 出现段错误
时间: 2024-03-15 19:45:10 浏览: 71
在代码中有一个错误:在函数add_record()中,Temp[index]是一个指向float的指针,但是却使用了malloc(sizeof(float))来为其分配内存,这样只会分配一个float大小的内存,但却要存储一个指向float的指针。应该使用malloc(sizeof(float *))来分配内存,这样才能存储指向float的指针。修改后的代码如下:
```
void add_record(float temp) {
if (index >= MAX_RECORDS) {
free(Temp[0]);
memmove(Temp, Temp + 1, (MAX_RECORDS - 1) * sizeof(float *));
index--;
}
Temp[index] = malloc(sizeof(float *));
memcpy(Temp[index], &temp, sizeof(float *));
index++;
}
```
另外,还有一个错误:在函数parse_temperature()中,如果没有找到"temp: "子串,那么不会进行任何操作,但是temp变量却没有被初始化,这可能导致在add_record()函数中出现未知的值。应该在parse_temperature()函数中的temp变量初始化为0,这样即使没有找到"temp: "子串,temp变量也会有一个默认值。修改后的代码如下:
```
void parse_temperature(char *line) {
char *temp_str;
char *token;
temp = 0; // 初始化为0
// 解析温度
if ((temp_str = strstr(line, "temp: ")) != NULL) {
temp_str += strlen("temp: ");
temp = strtof(temp_str, NULL);
}
}
```
修改这两处错误后,程序应该就可以正常运行了。
阅读全文