0

私はCに不慣れで、ZedShawのLearnC theHardWayを使用して学習しています。次のメモリエラーが発生する理由を見つけるのに問題があります。Valgrindを使用してコードをチェックしたので、メモリリークが発生していないことは間違いありません。

これが私のコードの問題のある行です:

 :  int main(int argc,char *argv[]){

        if (argc<3) die ("USAGE : ex17 <dbfile> <action> [action params]");
       ...char *filename=argv[1];// how are we able to get away with one dimension?
        char action =argv[2][0];
        /*Line 166*/:struct Connection *conn=Database_open(filename,action);// error throwing line

関数Database_openは次のように定義されます。

/*Line 61*/:struct Connection *Database_open(const char *filename, char mode)
{
    /* data */
    struct Connection *conn= malloc(sizeof(struct Connection));

    if(!conn->db) die("Memory Error");//?

    if(mode=='c'){
        conn->file=fopen(filename,"w");
    }
    else{
        conn->file=fopen(filename,"r+");


    if(conn->file){
        Database_load(conn);
    }
    }


        if(!conn->file) die("Failed to open file");
        return conn;
    };

そして、これが私が使用しているダイ関数です:

void die (const char *message)
{
        if(errno){
            perror(message);
        }
        else{
            printf("ERROR :%s\n", message);
        }
        exit(1);
}

また、Valgrindを使用してコードを実行すると、次のようになります。

==6112== Command: ./ex17 db.dat c
==6112== 
==6112== Conditional jump or move depends on uninitialised value(s)
==6112==    at 0x80487B3: Database_open (ex17.c:61)//Marked above
==6112==    by 0x8048BAA: main (ex17.c:166)// Line numbers marked above
==6112== 
ERROR :Memory Error
==6112== 
==6112== HEAP SUMMARY:
==6112==     in use at exit: 8 bytes in 1 blocks
==6112==   total heap usage: 1 allocs, 0 frees, 8 bytes allocated
==6112== 
==6112== LEAK SUMMARY:
==6112==    definitely lost: 0 bytes in 0 blocks
==6112==    indirectly lost: 0 bytes in 0 blocks
==6112==      possibly lost: 0 bytes in 0 blocks
==6112==    still reachable: 8 bytes in 1 blocks
==6112==         suppressed: 0 bytes in 0 blocks
==6112== Rerun with --leak-check=full to see details of leaked memory
==6112== 
==6112== For counts of detected and suppressed errors, rerun with: -v
==6112== Use --track-origins=yes to see where uninitialised values come from
==6112== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

編集

構造体接続

struct Connection
{
    /* data */
    FILE *file;
    struct Database *db;
};
4

2 に答える 2

2
struct Connection *conn = malloc(sizeof(struct Connection));

if(!conn->db) die("Memory Error"); // ?

新しく作成された変数conn->dbの内容を設定せずに、ゼロ以外の値になることを期待しています。connひょっとしたら、その場所にゼロがあるかもしれません。を使用するmalloc()と、返されたメモリの初期内容が何であるかは保証されないことに注意してください。

于 2012-09-06T18:49:07.337 に答える
1

構造に関する詳細を提供していただきありがとうございますConnection。ご覧のとおり、構造体には 2 つのポインター要素がメンバーとして含まれています。

構造体を割り当てた後、その中mallocの要素を明確にする必要がDatabase *dbあります。

何かのようなもの:

struct Connection *conn= malloc(sizeof(struct Connection));
conn->db = malloc(sizeof(struct Database));

お役に立てれば。

于 2012-09-06T19:02:41.150 に答える