gpt4 book ai didi

c - 使用链表时 malloc 中的段错误

转载 作者:行者123 更新时间:2023-11-30 14:56:31 25 4
gpt4 key购买 nike

程序从文件中读取数据,将所需的数据存储在一些变量中,然后将其压入堆栈。这是输入文件的一小部分,该文件包含重复多次的数据(每个数据 block 中变量的值发生变化)。

----------------------------------------------------------------------- 
Timestamp (Wed Mar 29 20:44:08 2017)
[1] Received msg from node <00116 / fc:c2:3d:00:00:10:ab:35>
RSSI -6 dBm / LQI 22
+[Node_Voltage] <2.963000 Volts>
+[P_MS5637] <896 mbar>
+[NTC_THERM (Murata NXFT15XH103)] <27.755314 deg C>
+[Temp_LM75B] <27.620001 Deg C>
+[RH_CC2D33S] <33.000000 %>
+[Temp_CC2D33S] <27.000000 Deg C>

存储的数据被推送到发生段错误的堆栈。故障发生后,程序只能存储一个堆栈。

void create(stack **head){
*head=NULL;
}

void copy_string(char arr[],char arr2[]){
int i=0;

for(i=0;i<strlen(arr2);i++){
arr[i] = arr2[i];
}
}

stack demo;
stack *tracker;

// **head is used since this is an ADT, i've not pasted the code in source file here

void push(stack **head,char date[],char time[],char month[],char year[],float pressure,float temprature1,float temprature2,float rel_humid,float node_voltage){
stack *temp = malloc(sizeof(demo));

temp->pressure = pressure;
temp->temprature1 = temprature1;
temp->temprature2 = temprature2;
temp->rel_humid = rel_humid;
temp->node_voltage = node_voltage;

printf("Inside push function\n");

copy_string(temp->date, date);
copy_string(temp->time, time);
copy_string(temp->month, month);
copy_string(temp->year, year);


if(*head==NULL){
temp->next = NULL;
*head = temp;
tracker = temp;
}
else{
tracker->next = temp;
tracker = tracker->next;
tracker->next = NULL;
}

free(temp); //on removing this, program runs infinitely instead of giving segmentation fault

printf("%s %s %f %f ",tracker->date,tracker->year,tracker->pressure,tracker->node_voltage);
}

使用 gdb(GNU 调试器)我收到此错误消息 -

Inside push function

29 2017) 896.000000 2.963000 Done!!

Program received signal SIGSEGV, Segmentation fault.
__GI___libc_free (mem=0x11f1) at malloc.c:2949
2949 malloc.c: No such file or directory.

已解决:整个问题的原因是免费的(临时),需要从上面的代码中删除它,也在主文件中,运行代码一次后文件指针被错误地关闭,因此正在运行无限循环再次接受输入时。

最佳答案

*head==NULL时,您正在free()然后访问同一个对象。请看下面标记为 **** 的行。

if(*head==NULL){
temp->next = NULL;
*head = temp;
tracker = temp;//**** temp is assigned to tracker. They point to the same place.
}
else{
//...
}

free(temp); //**** temp is free()d but remember tracker==temp..

//**** Now you output tracker but the object at this location was just freed.
printf("%s %s %f %f ",tracker->date,tracker->year,tracker->pressure,tracker->node_voltage);

因此,删除 free(temp) 它位于完全错误的位置,但您没有提供足够的代码来说明它的去向。

“无限循环”是其他一些错误,但您没有提供足够的代码来识别该错误。

还要注意 else 部分没有多大意义:

    tracker->next = temp;
tracker = tracker->next;
tracker->next = NULL;

尚不清楚 tracker 正在发生什么,但假设它是有效的,这相当于:

    tracker = temp;
temp->next = NULL;

关于c - 使用链表时 malloc 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44625157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com