在C中编程时出现跟踪/断点陷阱问题


#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
typedef struct StackB
{
int Top;
float Arr[30+10];
}*Stack;
Stack MakeEmpty(int Capacity);
void Clear(char *Str, int Len);
void Push(Stack S, float X);
float Pop(Stack S);
int main()
{
int i, j, First, Len, ELen;
const float MAX=1000000000000000000000000000000.0;
float Ans;
double Res, Div1, Div2;
char Str[30], Temp[30];
bool F;
F=true;
struct Obj
{
char Opr;
float Num;
}Expr[30];
Stack S;
S=MakeEmpty(30);
for (i=0;i<30;i++)
{
Expr[i].Num=MAX;
Expr[i].Opr='!';
}
gets(Str);
Len=strlen(Str);
for (i=0;i<Len;i++)
if (Str[i]==' ')
Str[i]='';
i=0;
j=0;
Clear(Temp, Len);
while (i<Len)
{
First=i;
while (Str[i]!='')
{
Temp[i-First]=Str[i];
i++;
}
if (Temp[1]==''&&(Temp[0]<'0'||Temp[0]>'9'))
{
Expr[j].Opr=Temp[0];
}
else
{
Res=atof(Temp);
Expr[j].Num=(float)Res;
}
i++;
j++;
Clear(Temp, Len);
}
ELen=--j;
for (i=ELen;i>=0;i--)
{
if (Expr[i].Opr=='!')
Push(S, Expr[i].Num);
else if (Expr[i].Num==MAX)
{
switch (Expr[i].Opr)
{
case '+':
Push(S, Pop(S)+Pop(S));
break;
case '-':
Push(S, Pop(S)-Pop(S));
break;
case '*':
Push(S, Pop(S)*Pop(S));
break;
case '/':
{
Div1=Pop(S);
Div2=Pop(S);
if (Div2==0)
F=false;
else
Push(S, Div1/Div2);
}
break;
}
if (!F)
break;
}
}
if (F)
{
free(S);
Ans=Pop(S);
printf("%.1f", Ans);
return 0;
}
else
{
free(S);
printf("ERROR");
return 0;
}
}
void Clear(char *Str, int Len)
{
int i;
for (i=0;i<Len;i++)
Str[i]='';
}
void Push(Stack S, float X)
{
S->Arr[++S->Top]=X;
}
float Pop(Stack S)
{
float Temp;
Temp=S->Arr[S->Top];
S->Arr[S->Top--]=0;
return Temp;
}
Stack MakeEmpty(int Capacity)
{
int i;
Stack S;
S=(Stack)malloc(sizeof(Stack));
S->Top=-1;
for (i=0;i<Capacity;i++)
S->Arr[i]=0;
return S;
}

我一直在处理一个dsa问题,在使用介于两者之间的断点运行GDB几次后,出现了一个名为trace/断点陷阱的异常。VS代码表明问题发生在这一行:

free(S);

我在其他地方被暗示,这与在程序结束时释放内存有关,但即使我试图释放堆栈,也会发生同样的事情。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
typedef struct StackB
{
int Top;
float Arr[30+10];
}*Stack; // Maybe you mean Stack ? 
/* .. 
code
..  
*/
if (F)
{
free(S); // Use after free
Ans=Pop(S); // <----
// Ans=Pop(S); free(S); that is the correct order
// Pop(S) is writing to an offset of S + something, so i think it writes on some critical data that the free() function left behind
printf("%.1f", Ans);
return 0;
}
else
{
free(S);
printf("ERROR");
return 0;
}

我认为这就是的问题

https://sourceware.org/glibc/wiki/MallocInternals#Free_Algorithm

此外,默认情况下,您将结构定义为指向结构的指针,因此它永远不会真正在堆栈上,并且您需要在堆上为它分配一些内存

最新更新