Comment éviter de “Segmentation Fault” dans un programme c
J'ai écrit un programme C de Registre de Cas. Mon programme fonctionne bien. J'ai utilisé -Wall
pour compiler. Il n'a montré aucun Avertissement.Mais le problem is
, si je veux l'exécuter avec bash loop
comme .test.sh | ./caseRegister
, la sortie est identique à celle ci-dessous:
:>>: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
Que test.sh est:
#/bin/sh
i=1
run=1
for ((; ; ))
do
echo $i
#echo $((i++))
done
Pourquoi mon code est montrant une "segmentation Fault" pour le long terme? Quiconque s'il vous plaît m'expliquer les causes et les techniques de prévention de la corriger. Thank u à l'avance.
Mon Code est:
#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;
}
- Il y a un problème dans ton code, le plus probablement, vous êtes à l'aide d'un pointeur qui ne pointe pas vers ce que vous attendez. Utiliser un débogueur pour savoir où et pourquoi.
- Je pense que nous avons besoin de voir le code C dans le but de répondre à cette question.
- Faute de Segmentation signifie que votre programme accès et l'exécution de mémoire non valide. Vous avez un bug. Voir un code peut aider les gens à analyser, mais d'abord, vous devez exécuter un débogueur sur elle pour voir si vous pouvez le comprendre par vous-même.
- définir les limites avec bash
ulimit
pour obtenir certainscore
de vidage. Compiler le programme avec l'gcc -Wall -g
; utilisationgdb
etvalgrind
pour le déboguer. Une violation de segmentation montre que le programme est buggé. - Comment lancer gdb avec boucle en bash?
gdb
pourrait être invoquée dans une boucle en bash, peut-être quegdb --args yourprogram
. Mais le plus important,gdb
peut être appelée sur uncore
de vidage. Et vous sortirez de votrebash
boucle si uncore
a été sous-évaluées...- Aussi compiler votre programme avec
gcc -Wall -g
et de l'améliorer jusqu'à pas d'avertissements sont donnés. N'utilisez pas degets
-il est obsolète et dangereux.
Vous devez vous connecter pour publier un commentaire.
pd.tableau seulement a de la place pour du 1024 résultats. Vous devez vérifier que no_prod est < 1024 avant d'écrire pour elle, sinon vous allez écrire dans la mémoire non allouée, qui est ce qui vous donne une erreur de segmentation. Une fois no_prod atteint 1024 vous devez interrompre le programme (je suppose que vous n'avez pas travaillé avec l'allocation dynamique encore).
C'est une bonne pratique pour ne pas écrire 1024 au vérifier si, mais plutôt d'utiliser une macro pour la taille de la matrice (ne vous inquiétez pas à ce sujet si vous n'avez pas utilisé les macros).