2012-03-07 21 views
1

私はCプログラミングの新人です。私はポインタの数学と混同しています。私はサイズ32の文字の配列を持っています。これは、文字変数が1バイト大きいので、配列が32バイトであることを意味すると私は理解しています。したがって32 characters * 1 byte = 32 bytesです。問題は、前に説明したように文字配列を指しているvoidポインターを持つ関数を持つときです。私は信じてポインタを使ったポインタ演算

for (count = 0; count < size; count++) 
*((int*) raw_sk + count) = 0 

コードセグメントことは、私がプログラムを実行すると、私はセグメンテーションフォールトを取得し、しかし、0に設定する必要がありますraw_skバッファ内のスロットのすべてを設定する必要があります。私は住所に数を追加しているという事実かもしれないと思った。私はアドレスに1つを追加すると、配列の次のスロットに移動していると思いました。誰かが間違っているところを指摘してくれますか?私が使用している機能は以下の通りです。 ありがとう! (おそらく sizeof(int)==4)が、配列だけ sizeバイト大きい合計 size*sizeof(int)バイトを超える

void 
write_skfile (const char *skfname, void *raw_sk, size_t raw_sklen) 
{ 
    int fdsk = 0; 
    char *s = NULL; 
    int status = 0; 
    int count = 0; 
    int size = (raw_sklen); 


    /* armor the raw symmetric key in raw_sk using armor64 */ 
    s = armor64(raw_sk, raw_sklen); 

    /* now let's write the armored symmetric key to skfname */ 

    if ((fdsk = open (skfname, O_WRONLY|O_TRUNC|O_CREAT, 0600)) == -1) { 
    perror (getprogname()); 

    /*scrubs the armored buffer*/ 
    for(count = 0; count < armor64len(s); count++) 
    s[count] = '0'; 

    free (s); 

    /* scrub the buffer that's holding the key before exiting */ 
    for (count = 0; count < size; count++) 
    *((int*)raw_sk + count) = 0; 

    exit (-1); 
    } 
    else { 
    status = write (fdsk, s, strlen (s)); 
    if (status != -1) { 
     status = write (fdsk, "\n", 1); 
    } 

    for (count = 0; (size_t)count < 22; count++) 
    *((int*)raw_sk + count) = 0; 

    free (s); 
    close (fdsk); 

    /* do not scrub the key buffer under normal circumstances 
     (it's up to the caller) */ 

    if (status == -1) { 
     printf ("%s: trouble writing symmetric key to file %s\n", 
      getprogname(), skfname); 
     perror (getprogname()); 

    /* scrub the buffer that's holding the key before exiting */ 

     /* scrub the buffer that's holding the key before exiting MY CODE 
    for (count = 0; count < size; count++) 
    *((int*)raw_sk + count) = 0;*/ 

     exit (-1); 
    } 
    } 
} 

答えて

3

ポインタをintのサイズだけ増やしています。それは間違いです。配列をゼロにしたい場合は、charのサイズだけインクリメントします。さらに良い方法は、memsetです。

+0

どのようにしてcharのサイズを増やすことができますか?私はコンパイラが私にそれをすると思った、明らかに私は間違っていた。 memsetの使い方を見ていきます。 – tpar44

+0

Memsetがトリックをやった!ありがとうございました! – tpar44

+0

@ tpar44: 'raw_sk'を' int * 'にキャストしようとしています。ポインタの算術演算は、ポインタの型を指定してインクリメントする方法を知っています。たとえば、charポインタに1を加えると、ポインタが1バイト増加します。 intポインタに1を加えると、4バイトずつ増加します(ほとんどの場合)。これを一般化して、* n *型のポインタに* n *を加えるとポインタを 'n * sizeof(x)'だけインクリメントすると言うことができます。だから、 'raw '_sk'を' char * 'にキャストしていれば、それはうまくいったでしょう。もちろん、それを行う慣用的な方法は、一時ポインタを作成し、 'count'変数を追加するのではなく単にインクリメントすることです。 –

0

あなたのループ反復します。したがって、セグメント化障害。

0

私はあなたが私はraw_skが配列

ポインタarithmaticをcharに指していると仮定ので、

*((char*) raw_sk + count) = 0 

を行うためのものだと思いますが

をchar型たく、この場合のように、型のサイズによってメモリアドレスを移動することで動作します
関連する問題