[英]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.