程序收到信号:“EXC_BAD_ACCESS”?

时间:2011-05-22 00:30:46

标签: c xcode command-line exc-bad-access

我正在使用XCode在C中创建命令行程序。在运行程序时,它最初会执行它应该执行的操作(询问我的文件路径)。但是,当我键入有效的和现有的文件路径时,它会给我以下错误:

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 个答案:

答案 0 :(得分:6)

您忘了为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; } 也会溢出。

这是一个注释版本的东西,它更接近你真正想要的东西:

{{1}}

如果我犯了任何一个错误,请告诉我。

您可以在上面的over here找到这些功能的参考资料。

答案 1 :(得分:5)

检查这一行:

char *string1

和这一行:

scanf("%s", string1);

你还没有为string1声明一个大小,这意味着你总会得到一个错误,用这样的东西修复它:

char string1[100]

如果100是输入的最大长度。

或按字符阅读输入字符。

并且,要删除警告,请将#include "string.h"添加到#include语句所在的位置。