プロが教えるわが家の防犯対策術!

main()内でいくつかの配列を動的確保するとごちゃごちゃするので、
関数化してみました。しかし、下のプログラムではうまい事いきませ
んでした。

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

void array1d(int *box,int n)
{
int i;
box=(int *)malloc(n * sizeof(int));
for(i=0; i<n; i++) { box[i]=0; }
}

main()
{
int *pol,i,n;
printf("N pol\nN = ");
scanf("%d",&n);
array1d(pol,n);
for(i=0; i<n; i++) { printf("[%d]=%d\n",i,pol[i]); }
}

実行結果は
[0]=-14646387
[1]=-1819410433
[2]=-224
array1d内では0を格納していますが、このようになりました。
どのようにすれば 0になるでしょうか?
回答よろしくお願いします。

A 回答 (3件)

もっと素直に考えた方がいいですよ。


動的にとるなら、関数内で確保すればいいのでは?
但しメモリの確保開放は入り口と出口が明示的にわかった方がいいので、あまり関数を分けて確保したり、開放したりするのは私的にお勧めできません。

ちょっと質問者のソースをいじってみました。
これでよいのではないですか?

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

//動的に確保するなら別に引数に渡さず確保した先頭アドレスだけ返せば良い!
int *array1d(int n)
{
int i;
int *box;

box=(int *)malloc(n * sizeof(int));

for(i=0; i<n; i++)
{
box[i]=0;
}

return box;
}

main()
{

int *pol,i,n;

printf("N pol\nN = ");

scanf("%d",&n);

pol = array1d(n);

for(i=0; i<n; i++)
{
printf("[%d]=%d\n",i,pol[i] );
}

//必ず開放して下さい。
free(pol);
}
    • good
    • 1
この回答へのお礼

これなら納得です!
わかりやすく教えていただいてありがとうございました!

お礼日時:2006/12/13 16:48

void array1d(int *box,int n)



void array1d(int **box,int n)
として、
box=(int *)malloc(n * sizeof(int));
for(i=0; i<n; i++) { box[i]=0; }

*box=(int *)malloc(n * sizeof(int));
for(i=0; i<n; i++) { (*box)[i]=0; }

理由はポインタのことをよーく考えてください。
ポインタのポインタはわかりづらいかもしれませんが、がんばって理解しましょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。参考にします。

お礼日時:2006/12/13 16:51

array1d の引数はintのポインタですよね。



ここでは[intのポインタ]=[int配列]のポインタを渡さなければなりませんよね。

ですので、mainで、array1dを呼ぶところで
array1d(&pol,n);

としなければなりませんし、他のところもそれに合わせて変えなければなりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。参考にします。

お礼日時:2006/12/13 16:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!