分段故障 – strcat

这是我的代码:

#include #include #include void main(int arge, char *argv[]) { FILE *f1; char ch,*fn="~/lyrics/"; strcat(fn,argv[1]); strcat(fn,".txt"); if( (f1 = fopen(fn,"r"))==NULL ) { printf("\nWrong filename\n%s not found",argv[1]); return; } while((ch=getw(f1))!=EOF) { printf("%c",ch); } } 

我使用gcc -g -o file file.c编译它,编译器没有给出任何错误消息。 但是当我运行它时,我收到错误消息:

 Segmentation fault (core dumped) Bad permissions for mapped region at address 0x8048659 at 0x402C36B: strcat (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) by 0x80484D6: main (lyrics.c:9) 

谁能帮帮我吗?

fn中没有足够的空间。 通过strcat’ing到它,你覆盖其堆栈分配的结束并进入堆栈..因此分段错误。

您可以尝试以下方式:

 char fn[255]; strcpy( fn, "~/lyrics/" ); strcat( fn, argv[1] ); strcat( fn, ".txt" ); 

您只需要确保整个路径和文件名可以容纳255个字符。

或者你可以这样做:

 char* fn = NULL; int argvLen = strlen( argv[1] ); fn = malloc( 9 + argvLen + 4 + 1 ); // Add 1 for null terminator. strcpy( fn, "~/lyrics/" ); strcat( fn, argv[1] ); strcat( fn, ".txt" ); 

而且你已经为字符串分配了足够的空间。 完成后,别忘了取消它!

 char *fn = "~/lyrics/"; 

因为fn可以指向只读内存中的字符串,所以应该将fn声明为const char指针。

 const char *fn = "~/lyrics/"; 

然后你可以看到有一些错误。 这是一个更好的解决方案:

 char fn[MAX_SIZE] = "~/lyrics/"; 

这里MAX_SIZE应该是"~/lyrics/"的大小, argv[1]的最大长度和".txt"的长度之和。

这种方法不可移植。

如果使用glibc你也可以调用asprintf()asprintf()需要分配你需要的内存。

 #include  ... char * pFn = NULL; if (-1 == asprintf(&pFn, "~/lyrics/%s.txt", argv+1); { perror("asprintf()"); } else { ... /* use pFn */ } free(pFn); ...