3 Stimmen

Programm empfangenes Signal: "EXC_BAD_ACCESS"?

Ich erstelle ein Befehlszeilenprogramm in C mit XCode. Wenn ich das Programm ausführe, tut es zunächst, was es tun soll (es fragt mich nach einem Dateipfad). Wenn ich jedoch einen gültigen und vorhandenen Dateipfad eingebe, wird die folgende Fehlermeldung angezeigt:

Program received signal:  “EXC_BAD_ACCESS”. sharedlibrary apply-load-rules all (gdb)

Ich habe zwei Warnungen in meinem Programm, die beide mit der Funktion strcat zu tun haben. Die Warnungen lauten:

warning: implicit declaration of function 'strcat'

y

warning: incompatible implicit declaration of built-in function 'strcat'

Ich frage mich, warum mein Programm nicht richtig ausgeführt wird.

Danke! Mike

Mein Code ist unten aufgeführt:

#include "stdlib.h"
int main (void)
{
   char *string1;
   printf("Type in your file path: ");
   scanf("%s", string1);
   char *string2 = "tar czvf YourNewFile.tar.gz ";
   strcat(string2, string1);
   system(string2);
}

Vielleicht hat es mit der Zuweisung der Zeichen zu tun?

6voto

mu is too short Punkte 411765

Sie haben vergessen, Platz zuzuweisen für string1 , scanf wird keinen Speicher für Sie zuweisen, das müssen Sie selbst tun. Außerdem, string2 auf nicht beschreibbaren Speicher zeigt und nicht genug Platz zum Anhängen hat string1 zu, so dass Ihr strcat würde überlaufen, selbst wenn Sie char string2[] = "tar czvf YourNewFile.tar.gz "; .

Hier ist eine kommentierte Version von etwas, das dem, was Sie wirklich wollen, näher kommt:

#include <stdio.h>  /* printf, sprintf, fgets */
#include <string.h> /* strcat, strlen */
#include <stdlib.h> /* malloc */

#define TAR "tar czvf YourNewFile.tar.gz"

int main(void) {
    char path[100] = { 0 };  /* Initialize to all 0 bytes.           */
    char *cmd;               /* We'll allocate space for this later. */
    int   len;

    printf("Type in your file path: ");
    fgets(path, sizeof(path), stdin);   /* Read at most 100 characters into path */

    /*
     * Remove the trailing newline (if present).
     */
    len = strlen(path);
    if(path[len - 1] == '\n')
        path[len - 1] = '\0';

    /*
     * Allocate room for our command. 
     */
    cmd = malloc(
          strlen(TAR)   /* Room for the base tar command.         */
        + 1             /* One more for the space.                */
        + strlen(path)  /* Room for the path we read.             */
        + 1             /* One more for the final nul terminator. */
    );

    /*
     * You could also use a bunch of strcpy and strcat stuff for
     * this but sprintf is less noisy and safe as long as you've
     * properly allocated your memory.
     */
    sprintf(cmd, "%s %s", TAR, path);

    /*
     * This is vulnerable to unpleasant things in `path` (such as spaces,
     * &, >, <, ...) but this will do as a learning exercise. In real life
     * you'd probably want to use fork and exec for this to avoid the  
     * interface issues with the shell.
     */
    system(cmd);  

    /*
     * Free the memory we allocated.
     */
    free(cmd);

    /*
     * You need a return value because of "int main(...)". Zero is
     * the standard "all's well" return value.
     */
    return 0;
}

Bitte lassen Sie mich wissen, ob ich mich geirrt habe.

Referenzmaterial zu den Funktionen finden Sie in der oben genannten hier drüben .

5voto

Dhaivat Pandya Punkte 6441

Prüfen Sie diese Zeile:

char *string1

und diese Zeile:

scanf("%s", string1);

Sie haben keine Größe für string1 deklariert, was bedeutet, dass Sie immer einen Fehler erhalten, beheben Sie es mit etwas wie diesem:

char string1[100]

Wenn 100 die maximale Länge Ihrer Eingabe ist.

Oder lesen Sie Ihre Eingabe Zeichen für Zeichen.

Und um die Warnungen loszuwerden, fügen Sie #include "string.h" dorthin, wo Ihr #include Aussagen sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X