私は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);
}
}
}
どのようにしてcharのサイズを増やすことができますか?私はコンパイラが私にそれをすると思った、明らかに私は間違っていた。 memsetの使い方を見ていきます。 – tpar44
Memsetがトリックをやった!ありがとうございました! – tpar44
@ tpar44: 'raw_sk'を' int * 'にキャストしようとしています。ポインタの算術演算は、ポインタの型を指定してインクリメントする方法を知っています。たとえば、charポインタに1を加えると、ポインタが1バイト増加します。 intポインタに1を加えると、4バイトずつ増加します(ほとんどの場合)。これを一般化して、* n *型のポインタに* n *を加えるとポインタを 'n * sizeof(x)'だけインクリメントすると言うことができます。だから、 'raw '_sk'を' char * 'にキャストしていれば、それはうまくいったでしょう。もちろん、それを行う慣用的な方法は、一時ポインタを作成し、 'count'変数を追加するのではなく単にインクリメントすることです。 –