[解決済み] テスト
質問
が表示されます。
malloc: *** error for object 0x1001012f8: incorrect checksum for freed object
- object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
のエラーが発生しました。
char* substr(const char* source, const char* start, const char* end) {
char *path_start, *path_end, *path;
int path_len, needle_len = strlen(start);
path_start = strcasestr(source, start);
if (path_start != NULL) {
path_start += needle_len;
path_end = strcasestr(path_start, end);
path_len = path_end - path_start;
path = malloc(path_len + 1);
strncpy(path, path_start, path_len);
path[path_len] = '\0';
} else {
path = NULL;
}
return path;
}
どうすればうまくいくのでしょうか?を使ってメモリを確保する関数を書き換えたところ
path[path_len + 1]
は正常に動作します。
さて、私が理解していない部分は、私が一度も
free
というのも、割り当てられたメモリはすべて、それが存在するまでの間、プログラムに必要だからです(AFAIKでは、とにかく割り当てられたメモリはすべて無効になるのでしょうか!)。
では、一度も解放していないのに、解放されたオブジェクトが破損することはあるのでしょうか?
この中で関数が呼び出されます。
char *read_response(int sock) {
int bytes_read;
char *buf = (char*)malloc(BUF_SIZE);
char *cur_position = buf;
while ((bytes_read = read(sock, cur_position, BUF_SIZE)) > 0) {
cur_position += bytes_read;
buf = realloc(buf, sizeof(buf) + BUF_SIZE);
}
int status = atoi(substr(buf, "HTTP/1.0 ", " "));
そこには
realloc
使い方が間違っているのでしょうか?私は完全なサーバー応答を読みたいので、反復のたびに再割り当てしなければなりませんね?
どのように解決するのですか?
で
read_response
で指定されたバッファの終端を上書きしているのでしょう。
buf
.
問題は、buf がポインタであることです。
sizeof(buf)
はポインタのサイズ(CPUにもよりますが、おそらく4か8)を返します。あなたが使っているのは
sizeof
あたかも
buf
これは、ある文脈では互換性があるように見えますが、C言語ではポインタと同じものではありません。
を使う代わりに
sizeof
に割り当てた最後のサイズを記録しておく必要があります。
buf
を追加し、さらに
BUF_SIZE
を、バッファを拡大するたびに追加してください。
また
read
と比べて、返す文字数がかなり少なくなる可能性があります。
BUF_SIZE
を呼び出すと、その都度
realloc
で
buf
を各反復で使用するのはやりすぎかもしれません。ただ、必要以上にメモリを消費してしまうだけで、正しさの点では問題はないでしょう。
私なら、もっと下のコードのようなことをします。
#define MIN_BUF_SPACE_THRESHOLD (BUF_SIZE / 2)
char *read_response(int sock) {
int bytes_read;
char *buf = (char*)malloc(BUF_SIZE);
int cur_position = 0;
int space_left = BUF_SIZE;
if (buf == NULL) {
exit(1); /* or try to cope with out-of-memory situation */
}
while ((bytes_read = read(sock, buf + cur_position, space_left)) > 0) {
cur_position += bytes_read;
space_left -= bytes_read;
if (space_left < MIN_BUF_SPACE_THRESHOLD) {
buf = realloc(buf, cur_position + space_left + BUF_SIZE);
if (buf == NULL) {
exit(1); /* or try to cope with out-of-memory situation */
}
space_left += BUF_SIZE;
}
}
このバージョンでは、もし
read
の呼び出しが数バイトのデータで戻ってくるだけです。
関連
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] mallocとcallocの違い?
最新
-
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 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?