2012-04-21 4 views
1

char *の配列へのポインタを関数(args)に送ります。この関数では、mallocされた文字列に対する配列の最初の2つの位置に値を設定します。配列自身がmallocされた関数呼び出し関数に戻ると、配列の最後の位置に "アドレス0x0のメモリにアクセスできません"というメッセージが表示されます。 malloc/realloc /で値が格納されていて、何か間違っていますか?関数から文字列の配列を返すときに、アドレス0x0のメモリにアクセスできません

呼び出す機能: -

int bufspace = 0; /* bytes in table */ 

    ... 

args = emalloc(BUFSIZ); /* initialize array */ 
bufspace = BUFSIZ;  //size=8192 
spots = BUFSIZ/sizeof(char *); 

while (*cp != '\0') //While not at the end 
    cp = read_segment(cp, &len, &indollarsign, &argnum, start, &args, &prev_char_escape); 
    start = cp; 
    len = 0; 

    if (argnum + 1 >= spots) { 
     args = erealloc(args, bufspace + BUFSIZ); 
     bufspace += BUFSIZ; 
     spots += (BUFSIZ/sizeof(char *)); 
     } 
    } 

呼び出された関数(read_segment)がまず1位の位置0に保存するために呼び出さ:この行では

*args[*argnum] = newstr(start, *len); //Generate the string through malloc 

、私はこれらの位置で文字列を持っています: * args [0]と* args [1]

args [0]には文字列がありますが、args [1]には " ddress 0x0 "

+1

なぜ 'read_segment'に' args'のアドレスを渡しますか? 'argnum'のタイプは何ですか? 'read_segment()'と 'newstr()'というコードはありません。 –

+0

タイプが何であるか、コードの一部しか表示していない場合は、質問に答えるのは非常に難しいです。 –

+0

'read_segment'の関連定義を追加できれば、問題はより明確になります。また、sizeof(char *)は固定されます(32ビットの場合は4、64ビットの場合は8)ので、スポットはすべての反復で一定の係数(4または8)だけインクリメントされます。 – vvnraman

答えて

2

*args[*argnum]ポインタをargs[*argnum]にデリファレンスします。あなたが意味すると思います

(*args)[*argnum] = newstr(start, *len); 
+0

ありがとうございます。それがトリックでした。 – user994165

関連する問題