Wie zu vermeiden "Segmentation Fault" in c-Programm
Ich habe geschrieben C-Programm für den Fall zu Registrieren. Mein Programm funktioniert gut. Ich verwendet -Wall
für die Kompilierung. Es zeigten sich keinerlei Warnung.Aber die problem is
, wenn ich will das es läuft mit bash loop
wie .test.sh | ./caseRegister
, die Ausgabe ist wie die unten:
:>>:1498.00
:>>:1499.00
:>>:1500.00
:>>:1501.00
:>>:1502.00
:>>:1503.00
:>>:1504.00
:>>:1505.00
:>>:1506.00
:>>:1507.00
:>>:1508.00
:>>:1509.00
:>>:1510.00
:>>:1511.00
:>>:1512.00
:>>:1513.00
:>>:1514.00
:>>:1515.00
:>>:1516.00
:>>:1517.00
:>>:1518.00
Segmentation fault
Dass test.sh ist:
#/bin/sh
i=1
run=1
for ((; ; ))
do
echo $i
#echo $((i++))
done
Warum mein code mit der Meldung "segmentation Fault" - für die lange Sicht? Bitte jemand mir erklären die Ursachen und Prävention Techniken zu berichtigen. Thank u im Voraus.
Mein Code ist:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct prod_details
{
int no_prod;
double total;
double array[1024];
}pd;
char *getinput(char *inp)
{
printf(":");
gets(inp);
if(strlen(inp) > 11)
{
printf("Input is restricted to 10 character\n");
getinput(inp);
}
return inp;
}
void print()
{
printf("Grant Total is : %.2f\n",pd.total);
}
int check(char *str)
{
int i,minusflag=0,plusflag=0,optrflag=0;
if(strlen(str) == 0)
return 0;
if(str[strlen(str) -1] == '+' || str[strlen(str) -1] == '-' || str[strlen(str) -1] == '*')
{
printf("last operator\n");
return 1;
}
if(str[0] == '-')
{
i=1;
while(str[i] != '-' )
{
if(str[i] == '\0')
{
minusflag=1;
break;
}
i++;
}
if(str[i] == '-')
{
minusflag=0;
return 1;
}
}
if(str[0] == '-')
{
i=1;
while(str[i] != '+' )
{
if(str[i] == '\0')
{
minusflag=1;
break;
}
i++;
}
if(str[i] == '+')
{
minusflag=0;
return 1;
}
}
if(str[0] == '-' && minusflag == 1)
return 2;
if(str[0] == '+')
{
i=1;
while(str[i] != '+')
{
if(str[i] == '\0')
{
plusflag=1;
break;
}
i++;
}
if(str[i] == '+')
{
plusflag=0;
return 1;
}
}
if(str[0] == '+')
{
i=1;
while(str[i] != '-' )
{
if(str[i] == '\0')
{
plusflag=1;
break;
}
i++;
}
if(str[i] == '-')
{
plusflag=0;
return 1;
}
}
if(str[0] == '+' && plusflag == 1)
return 2;
if(str[0] == '*')
return 1;
if((str[0] == '+' || str[0] == '-') && (str[1] == '+' || str[1] == '-' || str[1] == '*' || str[1] == '/' ))
return 1;
for(i=0;i<strlen(str);i++)
{
if(((str[i] >= '!' && str[i] <= '/') || (str[i] >= ':' && str[i] <= '~')))
{
if(str[i] == '*' || str[i] == '+' || str[i] == '-' || str[i] == '/')
{
optrflag++;
}
else
return 1;
}
}
if(optrflag == 1)
return 3;
else if(optrflag > 1)
return 1;
return 2;
}
int expcalc(char *str)
{
char copy[10];
char op;
char *temp;
char numb[10],numf[10];
printf("Start of expcal\n");
int i;
double result=0;
for(i=0;i<strlen(str);i++)
{
if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
{
op = str[i];
}
}
strcpy(copy,str);
i=0;
while(str[i] != op)
{
numf[i] = str[i];
i++;
}
numf[i] ='\0';
temp=strchr(copy,op);
i=1;
printf("\n");
while(temp[i] != '\0')
{
numb[i-1] = temp[i];
i++;
}
numb[i-1] = '\0';
switch(op)
{
case '+':
result=atof(numf)+atof(numb);
break;
case '-':
result=atof(numf)-atof(numb);
break;
case '*':
result=atof(numf)*atof(numb);
break;
case '/':
result=atof(numf)/atof(numb);
break;
default:
break;
}
printf("%.2f\n",result);
if((pd.total+result) < 0)
{
printf("Couldn't calculate\n");
return 0;
}
pd.array[pd.no_prod]=result;
pd.total=pd.total+result;
printf(">>:%.2f\n",pd.total);
pd.no_prod++;
return 0;
}
int calc(char *str)
{
if((pd.total+atof(str)) < 0)
{
printf("Coundn't Calculate\n");
return 0;
}
pd.array[pd.no_prod]=atof(str);
pd.total=pd.total+pd.array[pd.no_prod];
printf(">>:%.2f\n",pd.total);
pd.no_prod++;
return 0;
}
int call()
{
int chkflg;
char input[1024];
getinput(input);
chkflg=check(input);
if(chkflg == 3)
{
expcalc(input);
call();
}
else if(chkflg == 2)
{
calc(input);
call();
}
else if(chkflg == 1)
{
printf("You have entered Wrogly!!!\n Please enter correctly\n");
call();
}
else
{
print();
return 1;
}
return 0;
}
int main()
{
printf("..CASE RIGISTER..\n");
call();
return 0;
}
Es ist ein problem in Ihrem code, wahrscheinlich sind Sie mit einem Zeiger, der nicht auf das, was man erwartet. Verwenden Sie einen debugger, um herauszufinden, wo und warum.
Ich denke, wir müssen sehen, was der C-code, um diese Frage zu beantworten.
Segmentation fault bedeutet, dass Ihr Programm darauf zugegriffen oder Sie ausgeführt ungültigen Speicher zu. Du hast einen bug. Sehen Sie einige code, die helfen könnten, Menschen zu analysieren, aber zuerst sollten Sie ausführen, einen debugger, um zu sehen, wenn Sie es herausfinden für sich selbst.
stellen Sie die Grenzen mit der bash
Wie man gdb mit der bash-Schleife?
Ich denke, wir müssen sehen, was der C-code, um diese Frage zu beantworten.
Segmentation fault bedeutet, dass Ihr Programm darauf zugegriffen oder Sie ausgeführt ungültigen Speicher zu. Du hast einen bug. Sehen Sie einige code, die helfen könnten, Menschen zu analysieren, aber zuerst sollten Sie ausführen, einen debugger, um zu sehen, wenn Sie es herausfinden für sich selbst.
stellen Sie die Grenzen mit der bash
ulimit
um einige core
dump. Kompilieren Sie das Programm mit gcc -Wall -g
; verwenden gdb
und valgrind
um zu Debuggen. Eine Segmentierung Verletzung zeigt, dass das Programm ist buggy.Wie man gdb mit der bash-Schleife?
InformationsquelleAutor Dhasneem | 2013-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
pd.array hat nur Platz für 1024 Ergebnisse. Sie haben zu prüfen, dass no_prod ist < 1024 vor dem schreiben, sonst schreiben Sie in nicht zugeordneten Speicher, das ist, was gibt Ihnen einen segmentation fault. Einmal no_prod erreicht 1024 haben Sie zum Abbruch des Programms (ich nehme an, Sie haben nicht funktioniert, mit der dynamischen Zuordnung noch).
Es ist gute Praxis, eigentlich nicht schreiben, 1024 am check obwohl, sondern verwenden Sie ein makro für die array-Größe (nicht zu kümmern, wenn Sie nicht verwendet haben, können Makros).
InformationsquelleAutor Per Johansson