2016-05-12 42 views
1

で私のプログラムをデバッグする私のプログラムが正しく実行されますが、私はValgrindのとそれを分析するとき、私はエラーを取得:コンテキストでValgrindの

==18865== Syscall param execve(argv) points to unaddressable byte(s) 
==18865== at 0x513DCF7: execve (syscall-template.S:84) 
==18865== by 0x513E50A: execvpe (execvpe.c:146) 
==18865== by 0x406FE3: fork_pipes2 (util.c:1338) 
==18865== by 0x40376A: execute_pipeline (main.c:282) 
==18865== by 0x403E53: run_cmd (main.c:327) 
==18865== by 0x403E53: command (main.c:668) 
==18865== by 0x402722: main (main.c:870) 
==18865== Address 0x589bb88 is 0 bytes after a block of size 8 alloc'd 
==18865== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==18865== by 0x403E07: run_cmd (main.c:315) 
==18865== by 0x403E07: command (main.c:668) 
==18865== by 0x402722: main (main.c:870) 
==18865== 

問題のある行が

pipe->data = malloc(sizeof(char*));

あるコードを

です
int run_cmd(char *cmd) { 
    struct str_list *chunks = list_split(cmd, '|'); 
    struct pipeline *pipe = malloc(chunks->size * sizeof * pipe); 
    pipe->data = malloc(sizeof(char*)); 
    int i=0; 
    for (i= 0; i < chunks->size; i++) { /* TODO: factor out */; 
     int j=0; 
     for (j = 0; j < 1; j++) { 
      pipe[i].data[j] = strdup(chunks[i].argv[j]); 
     } 
    } 
    pipe->size = i; 
    int status = execute_pipeline(pipe); 
    return status; 
} 

私のデータ構造:

struct str_list { 
    char *name; 
    int size; 
    char **argv; 

}; 
struct pipeline { 
    char *name; 
    int size; 
    char **data; 
}; 

エラーが表示される理由を教えてください。私はmallocを正しく使用しなかったと思います。

+0

「sizeof * pipe」のような外側のループの内側に割り当てる必要がありますが、乗算と混同する必要があります。 – MikeCAT

+0

いくつかのデータを 'pipe [0] .data'に割り当てました。 'pipe [1] .data'以上に割り当てられないのはなぜですか? – MikeCAT

+0

@MikeCATただ1つの要素で配列をテストしています。多くのカウンターがあり、私はまだすべてのカウンターを正しく取得していませんでした。だから私は1つの要素でしかテストしていない。しかし、私は長いパイプラインに対して正しい出力を得ることができます。 'ls | wc'には2つの要素があります。 'fork'と' exec'をシステムコールしてコマンドを実行しています。 – Montao

答えて

1

この割り当ておよびこれらのループは、間違っている:

pipe->data = malloc(sizeof(char*)); 
for (i= 0; i < chunks->size; i++) { /* TODO: factor out */; 
    int j=0; 
    for (j = 0; j < 1; j++) { 
     pipe[i].data[j] = strdup(chunks[i].argv[j]); 
    } 
} 

割当のみアレイに最初パイプdataメンバーのためではなく、他のメモリを割り当てます。

for (i= 0; i < chunks->size; i++) { 
    pipe[i].data = malloc(sizeof(char *) * 1); 

    for (int j = 0; j < 1; j++) { 
     pipe[i].data[j] = strdup(chunks[i].argv[j]); 
    } 
} 
+0

しかし、まだ 'pipe [i] .data = malloc(sizeof(char *)* 1)'に関するエラーメッセージが出ます。 'アドレス0x589bce8はサイズ8のブロックの後に0バイトですalloc'd' – Montao