为什么这只适用于main中的所有内容?

时间:2013-12-22 16:01:32

标签: c function main

所以我试图做这个挑战: http://www.reddit.com/r/dailyprogrammer/comments/1sob1e/121113_challenge_144_easy_nuts_bolts/

我想使用文本文件进行输入。 如果我将我使用的单独函数的内容复制到main中,那么我可以使用的代码,但是在调用readall或compare函数之后它似乎没有运行任何东西。以下是我到目前为止的情况:

#include<stdio.h>
#include<stdlib.h>

//variable declarations
int i;
int n;
struct item *prices;

//function declarations
void readall();
int compare(int i);
int fail();

//structure definitions
struct item{
    char *name;
    int price;
};

//main
int main(int argc,char *argv[]){
    if(fail()){
        printf("Input not found\n");
        return 1;
    }
    else{
        readall();
        for(i=0;i<n-1;i++){
            if(compare(i)){
                printf("%s\n",prices[i].name); //not added price change yet
            }
        }
    }
free(prices);
return 0;
}

//functions
void readall(){
    FILE *input = fopen("input.txt","r");
    int n=0;
    fscanf(input,"%u",&n);
    struct item prices[2*n-1];
    malloc(sizeof(prices));
    for(i=0;i<2*n;i++){
        fscanf(input,"%ms",&prices[i].name);
        fscanf(input,"%u",&prices[i].price);
    }
    fclose(input);
}

int fail(){
    FILE *input = fopen("input.txt","r");
    fclose(input);
    if(input==NULL){
        return 1;
    }
    else{
        return 0;
    }
}

int compare(int i){
    if(prices[i].price==prices[i+n].price){
        return 1;
    }
    else{
        return 0;
    }
return 2;
}

在valgrind下运行的旁注中,我可以看到我显然没有正确处理记忆,因此任何关于这一点和/或任何其他建设性批评的提示都会受到赞赏。

2 个答案:

答案 0 :(得分:3)

您的readall功能错误。你正在做的是在堆栈上创建一个数组,然后在堆上mallocing一个单独的数组,它没有名字,因此从不使用和泄露。尝试

Prices = malloc(sizeof(item) * n);

答案 1 :(得分:2)

我看到两个直接的问题:

  1. prices数组分配在堆栈和随后的数组中 使用malloc()毫无意义。使用这样的东西:

    item* prices = malloc ((2*n-1) * sizeof(struct item));
    
  2. readall()的范围内,您可以定义一个变量n 阴影同名的全局变量。只有本地n 使用fscanf()填充。然而,后来对compare()的调用, 访问尚未初始化的全局n

  3. 您应该尝试为变量赋予有意义的名称 比inx。至少对于带有a的变量这样做 超过几行代码的有意义的生命周期。 (在我看来, 使用单字符变量名称对于简单循环是可以的。)