这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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)有谁能帮帮我吗?
发布于 2012-12-16 20:19:03
您在fn中没有足够的空间。通过strcat‘on它,你可以覆盖它的堆栈分配的末尾并进入堆栈。因此出现了分段故障。
您可以尝试执行以下操作:
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" );并且您已经为字符串分配了足够的空间。当你用完它的时候,不要忘了释放它!
发布于 2012-12-16 20:19:14
char *fn = "~/lyrics/";因为fn可以指向只读内存中的字符串,所以应该将fn声明为指向const char的指针。
const char *fn = "~/lyrics/";然后你可以看到有一些错误。下面是一个更好的解决方案:
char fn[MAX_SIZE] = "~/lyrics/";其中MAX_SIZE应为"~/lyrics/"的大小、argv[1]的最大长度和".txt"的长度之和。
发布于 2012-12-16 20:26:16
这种方法是不可移植的。
如果使用glibc,您还可以调用asprintf(),它可以根据需要分配尽可能多的内存。
#include <stdio.h>
...
char * pFn = NULL;
if (-1 == asprintf(&pFn, "~/lyrics/%s.txt", argv+1);
{
perror("asprintf()");
}
else
{
... /* use pFn */
}
free(pFn);
...https://stackoverflow.com/questions/13901209
复制相似问题