开发者

Program received signal: “EXC_BAD_ACCESS”?

开发者 https://www.devze.com 2023-03-07 18:38 出处:网络
I am making a command line program in C us开发者_StackOverflow中文版ing XCode. When running the program, it initially does what it is supposed to do (asks me for a file path). However, when I type in

I am making a command line program in C us开发者_StackOverflow中文版ing XCode. When running the program, it initially does what it is supposed to do (asks me for a file path). However, when I type in a valid and existing file path, it gives me the following error:

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

I have two warnings in my program, both of which have to do with the function strcat. The warnings are:

warning: implicit declaration of function 'strcat'

and

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

I am wondering why my program is not executing properly.

Thanks, Mike

My code is posted below:

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

Maybe it has to do with allocating the chars?


You forgot to allocate space for string1, scanf will not allocate memory for you, you have to do that yourself. Furthermore, string2 points at non-writeable memory and it doesn't have enough room to append string1 to it anyway so your strcat would overflow even if you had char string2[] = "tar czvf YourNewFile.tar.gz ";.

Here's an annotated version of something that's closer to what you really want:

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

Someone please let me know if I've made any off-by-one errors.

You can find reference material for the functions in the above over here.


Examine this line:

char *string1

and this line:

scanf("%s", string1);

You have not declared a size for string1, meaning that you will always get an error, fix it with something like this:

char string1[100]

If 100 is the maximum length of your input.

Or read your input character by character.

And, to get rid of the warnings, add #include "string.h" to where your #include statements are.

0

精彩评论

暂无评论...
验证码 换一张
取 消