[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
質問
まず、私が知っているのは 同様 の質問があります。しかし、私は本当に原始的なCのデータ型でより一般的な簡単な質問をしたいです。ということで、こちらです。
で
main.c
これらの文字列を入力するための関数を呼び出します。
int
main (int argc, char *argv[]){
char *host = NULL ;
char *database ;
char *collection_name;
char *filename = "";
char *fields = NULL;
char *query = NULL;
...
get_options(argc, argv, &host, &database, &collection_name, &filename,
&fields, &query, &aggregation);
内部 {コード :
{{コード
私のプログラムはうまくいくのですが、Valgrindが間違ったやり方をしていると教えてくれました。
get_options
エラーについて説明してください
if (*filename == NULL ) {
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+4);
strcpy(*filename, *collection_name);
strcat(*filename, ".tde"); # line 69
}
?
どうすればこの問題を解決できますか?
解決するには?
{コード
ヌル文字を追加する
==8608== Memcheck, a memory error detector
==8608== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==8608== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==8608== Command: ./coll2tde -h localhost -d test -c test
==8608==
==8608== Invalid write of size 1
==8608== at 0x403BE2: get_options (coll2tde.c:69)
==8608== by 0x402213: main (coll2tde.c:92)
==8608== Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd
==8608== at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8608== by 0x4C28D6F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8608== by 0x403BBC: get_options (coll2tde.c:67)
==8608== by 0x402213: main (coll2tde.c:92)
. スペースの確保を忘れています。
Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd
5文字分のスペースを追加する必要があります。4文字分
strcpy
サフィックス、そしてもう1つは
'\0'
ターミネーターです。現在のコードでは4つしか割り当てられていないので、最後の書き込みは新しいファイル名用に割り当てたブロックの直後(つまりその0バイト後)のスペースに行われることになります。
注意してください。
あなたのコードには共通の問題があります。
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
を再割り当てされるポインタに直接指定します。これは、次のような場合には問題ありません。
{コード
{コード
は成功しますが、失敗するとメモリリークが発生します。このエラーを修正するためには、以下の結果を保存する必要があります。
".tde"
を別の変数に入れ、それをチェックし
'\0'
に値を代入する前に
realloc
realloc
に直接割り当てる。
realloc
のポインタはメモリリークを引き起こします。
NULL
関連
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】execvp: バッドアドレスエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?