2017-09-18 2 views
-1

Ich habe viele andere Antworten auf Probleme wie meine gesucht und ausprobiert, aber ich verstehe es immer noch nicht, ich weiß nicht, was mir hier fehlt. Dieses Programm sollte eine Auktion simulieren, es ist ein Spiel, bei dem das kleinere "Gebot" gewinnt. Ich habe diesen Code entwickelt, aber wenn ich den Variablentyp strcpy und char verwende, kommt dieser Segmentierungsfehler auf.Warum bekomme ich "Segmentation Fault"?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int func02(int venc, int nj, int max, int mod, float med, char *nome); 
int lanc; 

int main (void) 
{ 

    lanc = func02(0, 36, 15, 0, 0, "nome"); 
    printf("%d", lanc); 
    return EXIT_SUCCESS; 
} 

int func02(int venc, int nj, int max, int mod, float med, char *nome) 
{ 

    int lance; 

    if (venc == 0) { 
     strcpy(nome, "ceadf"); 
     lance = 4; 
    } 
    else { 
     if ((med <= mod) && (venc >= mod)) { 
      lance = mod++; 
     } 
     else { 
      lance = venc++; 
     } 
    } 
    return(lance); 
} 
+0

'lanc = func02 (0, 36, 15, 0, 0, "nome");' und dann 'strcpy (nome "ceadf");' Sie können nicht tun, um diese –

+0

Compile mit allen Warnungen & Debug-Informationen ('gcc -Wall -Wextra -g' mit [GCC] (http://gcc.gnu.org/) ...). ** Verwenden Sie den Debugger ** 'gdb' –

+0

@RohanKumar bitte nicht den Stil des Beitrags bearbeiten, (wie Verschieben von Klammern in ihrer eigenen Zeile), es ist nicht sinnvoll. –

Antwort

3

Sie haben Stringliteral "nome" zu func02() geben und Ihr es schreiben.

Stringliterale nur, das Schreiben zu ihnen führen zu undefinierten Verhalten wie Segmentierung failt

1

Sie kann nicht die Funktion strcpy verwenden, um kopieren Sie die Zeichenfolge in einem String-Literal lesen.

Stattdessen dynamisch Ihre Zeichenfolge zuweisen und dann strcpy() aufrufen.

1

Okay, zuerst, wenn Sie Fragen wie diese stellen, ist es besser zu zeigen, auf welche Zeile der Code stürzt, und vorzugsweise ein Backtrace. Mit dieser sagte, hier ist was los:

lanc = func02(0, 36, 15, 0, 0, "nome"); 

Hier senden Sie die Konstante Zeichenfolge „nome“ zu func02.

strcpy(nome, "ceadf"); 

Hier können Sie versuchen, "ceadf" in nome, das aus zwei Gründen nicht zu kopieren:

  1. nome sind ein konstanter String. Sie können es nicht ändern.

  2. Auch wenn Sie es ändern könnte, ist es nur fünf Zeichen lang sein (jeder Buchstabe in „nome“ plus die Null-Byte), und Sie versuchen, sechs Bytes in sie kopieren (jeden Buchstaben „ceadf“ plus ein Nullbyte). Dies wäre ein Speicherproblem, selbst wenn Sie mit einer schreibbaren Zeichenfolge arbeiten würden. Im Allgemeinen würde ich die Verwendung von strcpy vermeiden, da es so einfach ist, Fehler zu machen.