[英]Can't find the memory leak in C program
我试图用C编写我的第一个项目,并且内存泄漏有一些问题。 我找不到错误,但是我认为do-while循环出了点问题。 该程序可以编译,但是当我尝试打开它时,出现了分段错误错误。 我究竟做错了什么?
我在程序中打开的文件是一个.txt文件,该文件带有字符序列,例如:dvorndvl。
我的目标是:我使用参数打开程序,它打开名为argv [1]的文件,并将字符序列从文件写入数组。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"file1.h"
#include"file2.h"
void bye(){
puts("See you!");
}
int main(int argc, char *argv[]) {
char a[30];
int i, x;
printf("-----SOME TEXT-----");
FILE *f;
f = fopen(argv[1], "r");
if (f = NULL) {
printf("User doesn't exist.\n");
exit(1);
}
else{
do{
a[i] = getc(f);
i++;
} while(a[i]!=EOF);
char b[30];
printf("Password? ");
scanf("%c", b);
if(strcmp(a,b) == 0){
printf("\nHi, %s!\n", argv[1]);
printf("What do you want to do?");
printf("1. Turn the devices on/off. \n");
printf("2. Change my password. \n");
printf("3. -EXIT-\n");
switch(x) {
case 1:
devices(); break; //in file1
case 2:
encrypt(argv[1]); break;//in file2
case 3:
atexit(bye); break;
}
}
else
printf("Password is incorrect\n");
}
fclose(f);
return 0;
}
我没有50的声誉,只能给您一个评论:(但是我想* f的处理程序是个问题。您不检查'f'是否为NULL,而是将f赋给NULL。
if (f=NULL) {
printf("User doesn't exist.\n");
exit(1);
应该:
if (f==NULL) {
printf("User doesn't exist.\n");
exit(1);
好的做法是始终检查NULL是否等于f:
if (NULL == f) {
printf("User doesn't exist.\n");
exit(1);
在这种情况下,如果您输入错误,程序将无法编译:)
首先有数字或小错误
int i, x;
i
不必须的值,以便你不能与提高它i++
也if (f = NULL) {
应改为if (f == NULL) {
char a[30];
和getc
很有风险,您应该使用临时字符串并malloc
一个满足您需要的数组,然后从getc
切换到fgetc
反向比较并具有(NULL == f)的建议既无关紧要又不好。
真正的问题是您编译的代码错误,可能是由于使用了不良的资源进行学习。
我怀疑您正在使用gcc并将目标文件作为参数传递。
相反,您应该传递-Wall并可能传递其他标志,如下所示:
$ gcc -Wall -Wextra crap.c
crap.c: In function ‘main’:
crap.c:18:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if (f = NULL) {
^~
如您所见,编译器发现了意外分配,没问题,您只需要问一下。 它还可以发现许多其他问题,您知道使用上述标志可以解决这些问题。
还要注意,如果有两个变量在起作用,那么反向比较将无济于事,例如,将if(foo = bar)切换为if(bar = foo)毫无帮助。 另一方面,要求编译器警告您有关问题的情况。
如果您使用其他编译器,则肯定可以使用一种方法来启用警告。 为了争辩,如果您得到了不能进行基本分析的功能,请停止使用它。 我强烈建议您不要使用(NULL == f),因为这违反了最常用的样式,如上所述,它对任何事情都没有帮助。
该代码仍然存在很多错误,超出了编译器可以轻易发现的范围。 我稍后可能会注释它。
这里有几处错误:
if (f = NULL) {
您将f
更改为NULL
,而不是针对NULL
对其进行测试。 使用==
。 为避免将来发生此类错误,请将r值放在左侧,如下所示:
NULL == f
下一个:
char b[30];
scanf("%c", b);
如果要使用scanf
读取字符串,则需要使用%s
格式说明符,而不是%c
,它用于单个字符。 我不会使用scanf
。 请改用fgets
因为它更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.