質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Q&A

解決済

1回答

457閲覧

別関数でrealloc後、戻ってfreeでのエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

0グッド

0クリップ

投稿2023/02/28 12:10

実現したいこと

別関数でrealloc後、freeでエラーが発生する。

前提

ソースコードは抜粋です。
DataSet関数でreallocの必要があります。

発生している問題・エラーメッセージ

Test.exe によってブレークポイントが発生しました。

該当のソースコード

int DataSet(char* src){
char* d = (char*)realloc(src, 2);
if(d == NULL)return -1;
src = d;
return 0;
}
int main(int argc, const char* argv[]){
char* buf = (char*)malloc(1);//エラー処理省略
buf[0] = 1;
DataSet(buf);//エラー処理省略
free(buf);
return 0;
}

試したこと

ポインターの問題と考え、ネットで調べてみましたが、初心者の為か、検索できませんでした。頻出だと思うのですが、お知恵、御指摘頂けますと幸いです。URLを参照しろとの御指摘でも十分です。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2019
Version 16.11.21
VisualStudio.16.Release/16.11.21+33027.164
Microsoft .NET Framework
Version 4.8.03761

Visual C++ 2019 00435-00000-00000-AA302
Microsoft Visual C++ 2019

開発環境は、windows7(64)です。(7なのは、"先様"のためです。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/02/28 12:36

//エラー処理省略 の部分は実際にはエラーをチェックする処理が書いてあるが、記載を省略しているだけでしょうか?
guest

回答1

0

ベストアンサー

src は仮引数です。 仮引数は自動変数と同じ寿命を持ち、この場合でいえば DataSet 関数終了と同時に消えるだけです。 src への代入は無意味です。

その一方で realloc で再配置することによって buf が指す先は無効になっています。 無効なところへ書き込もうとした結果は未定義です。

おそらく意図しているのはこういうことでしょうか?

c

1#include <stdlib.h> 2 3int DataSet(char** src){ 4 char* d = (char*)realloc(*src, 2); 5 if(d == NULL)return -1; 6 *src = d; 7 return 0; 8} 9 10int main(int argc, const char* argv[]){ 11 char* buf = (char*)malloc(1); 12 buf[0] = 1; 13 DataSet(&buf); 14 free(buf); 15 return 0; 16}

realloc は元のメモリブロックが再利用されることもある (移動しないこともある) ので条件によっては質問で提示されたコードでも問題が顕現しないこともあるかもしれませんが、 realloc の結果はあくまでも realloc の返却値として返されたもののほうです。

投稿2023/02/28 12:35

SaitoAtsushi

総合スコア5714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/02/28 12:48

ありがとうございます。ご指摘の通りです。ダブルポインタにすべきでした。お恥ずかしい限りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問