2016-03-21 14 views
-3

Old Test私は私がやるべきものを学ぼうと、かかった古いテストの答えを探しています。(malloc関数たぶん?)

私は私が撮ったテストの上に行くよ、何を把握しようとしています答えはこれらの質問に答えていました。誰かが私を助けることができるかどうか疑問に思っていた?あなたはおそらく私が当時にそれらに答える方法を本当に理解していなかったが、私は学びたいと思います。私は答えがMallocと何か関係があると信じていましたが、正確にはわからなかったのです。

ありがとうございました!

編集:これは、あなたがそれを行う方法ですか?

#include <stdio.h> 
#include <stdlib.h> 
float* func(); 
int main(void) 
{ 
    float *x; 
    x = func(); 
    printf("%f\n", *x); 
    return 0; 
} 

float* func(void){ 
    float * z; 
    z = malloc(sizeof(float)); 
    * z = 11.2; 
    return z; 
} 
+0

ヒント:ローカル変数のアドレスを返す –

+0

はい、それはわかっていますが、それを修正する方法がわかりません:/ –

+0

それを分かっていれば、mallocがどのように修正するのか理解できるはずです。 –

答えて

0

mallocはメモリの割り当てに関連しています。

我々はC言語で、配列とポインタについて話

は、我々は静的配列と動的配列にそれを区切ることができます。静的配列のために、我々は、例えば、ダイナミックアレイ10. の長さARR名前CHAR型の配列を宣言する手段

char arr[10]; 

のアレイを使用し、我々は、例えば、ポインタを使用して、チャー*のARR。これは、arのchar型ポインタを意味します。ポインタは非常に柔軟です。したがって、正しく使用するように指示する必要があります。

これは、あなたがポインタを持っていて、また、異なる長さのreallocでメモリを割り当てる再できる10の長さのchar型のサイズでメモリを割り当てることを意味します

char *arr = (char *) malloc (sizeof (char) * 10); 

とします。あなたは

free(arr); 

追加する必要があり、それを使用しての終了時に、これはC言語の利点があると私は他の言語が、より多くの柔軟性よりも使用することが困難であると考えています。一方、あなたは非常にそれを使用して慎重にする必要があります。正しく使用されていないポインタは、ソフトウェア全体の障害を引き起こす可能性があります。

+0

[mallocの結果をキャストしない](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – user3386109

+0

うわー。 OK。良いリンク。 Thx dude @ user3386109 – Sean83

0

float zはfucntionでローカルに定義されているため、スタックに割り当てられます。 その結果、関数が終了するとメモリ割り当てが破棄されます。 その結果、あなたに属していないメモリにアクセスしているため、ランタイムエラーが発生します。

関連する問題