简体   繁体   English

程序收到信号:“EXC_BAD_ACCESS”?

[英]Program received signal: “EXC_BAD_ACCESS”?

I am making a command line program in C using XCode. 我正在使用XCode在C中创建命令行程序。 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. 我的程序中有两个警告,这两个警告都与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. 你忘了为string1分配空间, scanf不会为你分配内存,你必须自己做。 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 "; 此外, string2指向不可写的内存,并且它没有足够的空间来向它追加string1 ,所以即使你有char string2[] = "tar czvf YourNewFile.tar.gz ";你的strcat也会溢出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: 你没有为string1声明一个大小,这意味着你总会得到一个错误,修复它是这样的:

char string1[100]

If 100 is the maximum length of your input. 如果100是输入的最大长度。

Or read your input character by character. 或者按字符阅读输入字符。

And, to get rid of the warnings, add #include "string.h" to where your #include statements are. 并且,要消除警告,请将#include "string.h"添加到#include语句所在的位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM