首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分割故障- strcat

分割故障- strcat
EN

Stack Overflow用户
提问于 2012-12-16 20:18:02
回答 3查看 31.1K关注 0票数 6

这是我的代码:

代码语言:javascript
复制
#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编译它,编译器没有给出错误消息。但是当我运行它时,我得到了错误消息:

代码语言:javascript
复制
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)

有谁能帮帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-16 20:19:03

您在fn中没有足够的空间。通过strcat‘on它,你可以覆盖它的堆栈分配的末尾并进入堆栈。因此出现了分段故障。

您可以尝试执行以下操作:

代码语言:javascript
复制
char fn[255];
strcpy( fn, "~/lyrics/" );
strcat( fn, argv[1] );
strcat( fn, ".txt" );

您只需确保整个路径和文件名可以包含255个字符。

或者,您可以这样做:

代码语言:javascript
复制
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" );

并且您已经为字符串分配了足够的空间。当你用完它的时候,不要忘了释放它!

票数 9
EN

Stack Overflow用户

发布于 2012-12-16 20:19:14

代码语言:javascript
复制
char *fn = "~/lyrics/";

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

代码语言:javascript
复制
const char *fn = "~/lyrics/";

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

代码语言:javascript
复制
char fn[MAX_SIZE] = "~/lyrics/";

其中MAX_SIZE应为"~/lyrics/"的大小、argv[1]的最大长度和".txt"的长度之和。

票数 5
EN

Stack Overflow用户

发布于 2012-12-16 20:26:16

这种方法是不可移植的。

如果使用glibc,您还可以调用asprintf(),它可以根据需要分配尽可能多的内存。

代码语言:javascript
复制
#include <stdio.h>

...

char * pFn = NULL;

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

free(pFn);

...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13901209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档