簡體   English   中英

在C程序中找不到內存泄漏

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM