c - 为什么 Valgrind 会清理我的输入文本文件?

标签 c segmentation-fault valgrind

我有一个代码,我想测试在哪里出现段错误。但是当我运行 valgrind 时,如果让我转向一个我没有做错任何事情的地方。它忽略输入的 txt 文件并将其删除。 这是代码:

int main(int argc, char * argv[]){
FILE * input=fopen(argv[1],"r");
FILE * output=fopen(argv[2],"w");
int i,j,NumCrom;
int instancias=0,torres,InstanciaAtual=0;
    fscanf(input,"%i",&instancias);
//......
return (EXIT_SUCCESS);
}

valgrind 错误:

 1 errors in context 1 of 1:
==13878== Invalid read of size 4
==13878==    at 0x53A935A: __isoc99_fscanf (isoc99_fscanf.c:31)
==13878==    by 0x400CF0: main (main.c:18)
==13878==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

但这部分没有任何问题。它可以通过函数单独读取txt。每次我启动 valgrind 时,它都会清除输入 txt,这就是返回此段错误的原因(但它得到了其他不会返回的内容,因为 valgrind 会在此之前的第一个段错误调用中关闭)。 有人可以帮我吗? 感谢您对此提供的任何帮助。

最佳答案

fopen(argv[1],"r");

显然返回 NULL(这是有意义的,因为它是地址 0x0),请确保文件(在 argv[1] 中指定)存在并且(!)您在代码中执行 NULL 检查。

fscanf 中的段错误是很自然的,因为您尝试从 NULL 读取。
当你使用 valgrind 运行时,你是否可能忘记传递参数?

关于c - 为什么 Valgrind 会清理我的输入文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438349/

相关文章:

c++ - 段错误 : 11 when popping a vector in C++

ubuntu - 将 callgrind 设置为 valgrind 的默认工具

c++ - 重新分配已删除的数组并读取释放的内存

java - 从性能角度来看,对于典型的并行场景,使用 Hadoop 比使用 MPI 更好吗?

c - 父进程不获取子进程返回变量

c - strlen() 没有给出正确的值?

c - 输出为-nan

C - 比较整数时出现段错误

c - SHA256 使用 Openssl 导致段错误

macos - 安装 valgrind 时出错