スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

malloc・newで確保したポインタを返す関数の作成時に気を付けるべきこと

関数内でmallocするときの注意
http://oswald.hatenablog.com/entry/20081210/1228920110

この記事と全く同じミスをしてしまったのですが、対策として返り値を使用するといった手段を挙げているので、「リスク回避」ですね。
解決にはなってないような気がします。

もう少し考え直してみる。

#include <stdio.h>
#include <stdlib.h>

void alc5(int *p){
int i;
p = (int *)malloc (sizeof(int)*5);
for (i=0;i<5;i++)p[i]=i*i;
}
int main (void){
int *p,i;

alc5(p);
for (i=0;i<5;i++) printf("%d\n",p[i]);

free (p);
return 0;
}

セグメンテーションエラー引き起こします。何故か。

alc5(p);

ポインタ変数の中身のコピーを渡してます。
ポインタ変数の中身を書き換えたいなら、ポインタ変数のポインタのコピーを渡すべき。

「ポインタのポインタ」または「ポインタの参照型(C++)」が正解。

#include <stdio.h>
#include <stdlib.h>

void alc5(int **p){
int i;
*p = (int *)malloc (sizeof(int)*5);
for (i=0;i<5;i++) (*p)[i]=i*i;
}
int main (void){
int *p,i;

alc5(&p);
for (i=0;i<5;i++) printf("%d\n",p[i]);

free (p);
return 0;
}

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : C

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
635位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
94位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。