私はC++コンパイラを使用しています(したがって、calloc
関数呼び出しのキャスト)が、コードは本質的にCです。C/C++のセグメンテーションフォールトにおけるCスタイルのunsigned char解析と操作
基本的に、私は、バイナリからファイル解析する文字列バッファを作成するために使用していviByte
として知らunsigned char
にtypedef
、持っている(正確には、TGAファイルを - しかし、それは無関係です)。
私は今、基本的な機能を書いています。追加、追加、新規など
問題は、最初のループの最初の反復でviByteBuf_Prepend
に、私はセグメント化エラーが発生するということです。私はなぜ、これが正確に何かを知る必要があります。これは、何点かのポインタ(意図しない言葉)なしで私を一晩中寝かせることができるものです。
私も自分のアルゴリズムは、バッファが事前保留viByte
文字列であるかという点で正しいかどうかを知りたいです。例えば、私はmemset
をあまりにも多く使うと悪い考えかもしれないという気持ちがあり、unsigned charのprintf形式が正しいかどうか(私のコンソールに何も出力されていないと感じています) 。
GCC、Linuxでコンパイルしてください。
ゼコード
#ifdef VI_BYTEBUF_DEBUG
void viByteBuf_TestPrepend(void)
{
viByteBuf* buf = viByteBuf_New(4);
buf->str = (viByte*) 0x1;
printf(" Before viByteBuf_Prepend => %uc ", buf->str);
viByteBuf_Prepend(buf, 3, (viByte*) 0x2);
printf(" After viByteBuf_Prepend => %uc ", buf->str);
}
#endif
viByteBuf* viByteBuf_New(unsigned int len)
{
viByteBuf* buf = (viByteBuf*) calloc(sizeof(viByteBuf), 1);
const int buflen = len + 1;
buf->str = (viByte*) calloc(sizeof(viByte), buflen);
buf->len = buflen;
buf->str[ buflen ] = '\0';
return buf;
}
void viByteBuf_Prepend(viByteBuf* buf, unsigned int len, viByte* str)
{
unsigned int pos, i;
const unsigned int totallen = buf->len + len;
viByteBuf* tmp = viByteBuf_New(totallen);
viByte* strpos = buf->str;
memset(tmp->str, 0, tmp->len);
int index;
for(i = 0; i < buf->len; ++i)
{
index = (buf->len - i) - 1;
*strpos = buf->str[ 0 ];
++strpos;
}
memset(buf->str, 0, buf->len);
printf("%uc\n", buf->str);
i = totallen;
for (pos = 0; pos < len; ++pos)
{
tmp->str[ pos ] = str[ pos ];
tmp->str[ i ] = buf->str[ i ];
--i;
}
memset(buf->str, 0, buf->len);
buf->len = tmp->len;
memcpy(buf->str, tmp->str, tmp->len);
viByteBuf_Free(tmp);
//memset()
//realloc((viByteBuf*) buf, sizeof(viByteBuf) * tmp->len);
}
多くは、ありがとう。
更新
申し訳ありませんが、私は明示的にセグメンテーションフォールトがあるコードを掲載している必要があります。それは右ここにある:あなたのコードに
for(i = 0; i < buf->len; ++i)
{
index = (buf->len - i) - 1;
*strpos = buf->str[ 0 ]; //<--segmentation fault.
++strpos;
}
1と2のような数字をポインタにキャストしているのはなぜですか?特別なものがアドレス1と2にあると思いますか? –
デバッガで実行してみましたか?セグメンテーション違反が発生した正確な行が表示され、変数がNULLかどうかを確認するための変数をチェックすることができます。 –
'buf-> str [buflen] = '\ 0';'はバッファオーバーフローです。配列に10個のエントリしかない場合は、エントリ番号0があるためエントリ番号10はありません。 –