gpt4 book ai didi

c - 函数内部 fopen 后出现段错误。在 main 中执行 fopen 时没有问题,

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:06 28 4
gpt4 key购买 nike

我正在尝试学习 C。函数 Foo 的目标是接受一个字符串,更改其中的一些字符,然后查看是否存在具有该名称的文件。如果存在这样的文件,则在 STDOUT 上打印它的内容。

听起来很简单而且应该很简单,但是当我在 Foo 函数中调用 fopen 时,我总是遇到段错误。我想我在用内存做坏事,但我不知道它是什么。

这是来源:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

void Foo(const char* fname);

int main()
{
printf("Hello world!\n");
Foo("a.c");
return 0;
}


void Foo(const char* fname)
{
size_t len = strlen(fname);
printf("size is %i", (int)len);
char* fname_hash;
strcpy(fname_hash, fname);

int i;
//"escape" some of the characters
for(i =0; i < len; i++){
if( fname_hash[i] == '/'
|| fname_hash[i] == '.'
|| fname_hash[i] == '&'
|| fname_hash[i] == ' '
|| fname_hash[i] == '_'){
fname_hash[i] = '_';
}
}

if( access( fname_hash, F_OK ) != -1 ) {
printf("File exists\n");
FILE* fp = fopen ( fname_hash , "r" );
if( !fp ) perror(fname_hash),exit(1);

fseek( fp , 0L , SEEK_END);
long lSize = ftell( fp );
rewind( fp );

char* buffer = calloc( 1, lSize+1 );
if( !buffer ) fclose(fp),fputs("memory alloc fails",stderr),exit(1);

if( 1!=fread( buffer , lSize, 1 , fp) )
fclose(fp),free(buffer),fputs("entire read fails",stderr),exit(1);

printf("%s", buffer);

fclose(fp);
free(buffer);
} else {
// do something else
}
}

最佳答案

这段代码:

char* fname_hash;
strcpy(fname_hash, fname)

是一个严重的问题。

char* fname_hash 只是在堆栈上为指向字符串或某些字符的指针腾出空间。它不会为字符串分配任何空间,也不会将指针设置为指向任何地方(它将具有随机值)。

随后的 strcpy,然后将 fname 复制到那个随机位置,这几乎不可避免地是一场灾难,尽管当覆盖随机内存位的含义变成稍后在执行代码时清除。

您要么需要使用 malloc 分配一些空间(并记得稍后将其清除),要么您需要执行以下操作:

char fname_hash[100];

相反,您必须考虑“100”这个数字到底应该是多少,并且您应该考虑如果 fname 比您保留的空间长会发生什么情况。

对于“c”中的字符串处理,一个合理的经验法则是,如果代码看起来很简单,而且似乎只是在使用基本的标准库函数做你想做的事情,那么它实际上是完全错误的,而且充满了危险。

关于c - 函数内部 fopen 后出现段错误。在 main 中执行 fopen 时没有问题,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826838/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com