Программа получила сигнал: «EXC_BAD_ACCESS»? - PullRequest
3 голосов
/ 22 мая 2011

Я делаю программу командной строки на C, используя XCode.При запуске программы она изначально делает то, что должна (запрашивает путь к файлу).Однако, когда я набираю допустимый и существующий путь к файлу, он выдает мне следующую ошибку:

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

В моей программе есть два предупреждения, оба из которых имеют отношение к функции strcat.Предупреждения:

warning: implicit declaration of function 'strcat'

и

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

Мне интересно, почему моя программа не выполняется должным образом.

Спасибо, Майк

Мойкод размещен ниже:

#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);
}

Может быть, это связано с распределением символов?

Ответы [ 2 ]

6 голосов
/ 22 мая 2011

Вы забыли выделить место для string1, scanf не выделит вам память, вы должны сделать это самостоятельно. Кроме того, string2 указывает на недоступную для записи память, и у нее недостаточно места для добавления string1 к ней, так что ваш strcat будет переполнен, даже если у вас есть char string2[] = "tar czvf YourNewFile.tar.gz ";.

Вот аннотированная версия чего-то, что ближе к тому, что вы действительно хотите:

#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;
}

Кто-нибудь, пожалуйста, дайте мне знать, если я допустил какие-либо ошибки по одному.

Справочный материал по функциям приведен выше здесь .

5 голосов
/ 22 мая 2011

Проверьте эту строку:

char *string1

и эту строку:

scanf("%s", string1);

Вы не объявили размер для строки1, что означает, что вы всегда будете получать ошибку, исправьте ее с помощьючто-то вроде этого:

char string1[100]

Если максимальная длина вашего ввода равна 100.

Или считайте введенный символ за символом.

И, чтобы избавиться от предупреждений, добавьте #include "string.h" туда, где находятся ваши #include заявления.

...