在C程序

时间:2017-06-13 19:25:24

标签: c memory-leaks

我正在尝试用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;
}

4 个答案:

答案 0 :(得分:2)

我没有50个声誉给你一个评论:( 但 我想* f的处理程序是一个问题。你不会检查是否&#39; f&#39;是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);

在这种情况下如果你弄错了,程序将无法编译:)

答案 1 :(得分:2)

这里有数字或小错误 第一次

int i, x; i没有值,所以你不能用i++来提高它 也 if (f = NULL) {应更改为if (f == NULL) {

char a[30];getc风险非常大,您应该使用临时字符串malloc 一个符合您需求的数组,并从getc切换到fgetc

答案 2 :(得分:2)

反转比较的建议(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) {
     ^~

正如您所看到的,编译器发现无意识的分配没有问题,您只需要问它。它还可以发现无数其他问题,你知道上述标志要求它。

另请注意,如果2个变量处于正常状态,那么逆转比较将无济于事,例如:将if(foo = bar)切换为if(bar = foo)对你没有任何帮助。另一方面,要求编译器警告您遇到的问题。

如果您使用的是其他编译器,那么它肯定有办法启用警告。为了论证,如果你有一个不能进行基本分析的,请停止使用它。 我强烈建议你如果(NULL == f),因为这与最常用的风格相反,并且如上所述它对任何事情没有帮助。

代码仍然非常错误,超出了编译器可以轻易发现的范围。我可以稍后再去注释。

答案 3 :(得分:1)

这里有一些问题:

 if (f = NULL) {

您正在将f更改为NULL,而不是针对NULL对其进行测试。使用==。为了防止将来出现这种错误,请将r值放在左侧,如下所示:

 NULL == f

下一步:

char b[30];
scanf("%c", b);

如果您打算使用scanf来读取字符串,则需要使用%s格式说明符,而不是%c,这是单个字符。我根本不会使用scanf;请使用fgets,因为它更安全。