2016-09-15 7 views
0

私はC認定試験に合格する準備をしており、練習問題の1つは本当に私を困惑させています。私の練習のC認定試験で暗号解読コードを解読するのに助けが必要

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    float *t = 1 + (float *) malloc(sizeof(float) * sizeof(float)); 
    t--; 
    *t = 8.0; 
    t[1] = *t/4.0; 
    t++; 
    t[-1] = *t/2.0; 
    printf("%f\n",*t); 
    free(--t); 
    return 0; 
} 

私が書き留めするつもりです:私は(はい、私はこのコードは不自然ですけど、それは私がこの証明書試験に合格するために取り扱っておりますものです)私はこのコードを理解するのに役立ちますいくつかのCの専門家を期待しています私は各行が信じていることを確認し、訂正するでしょう。

1:float型へのポインタである変数tを定義します。このシステムがどのくらいのタイプで動作しているのか分からないので、どのくらいの大きさのメモリが割り当てられているかを知る方法はわかりません。割り当て後、ポインタを移動する必要があると思う1を追加しますが、確実ではありません

2:ポインタを元に戻しますか?

3:メモリに8.0トンによって

4指さ値を割り当て:8.0(* T)4.0で割りと2を思い付くが、私はtは、[1]であるかを理解していませんこの場合

5:ポインタを移動しますか?しかし、ここでこれは*型フロートの

6であるので:

7(* tはこの時点であるものを見つけ出すことができなかった)バック1をポインタを移動し、*のT/2.0を代入:プリントアウト値はトンによる

8指さ:密接に見ていない--t

+0

によって指されたメモリを解放し、サイズ 'はsizeof(フロート)*はsizeof(フロート)'奇妙に見えます。通常、サイズの計算は '(1要素のサイズ)*(要素の数)'になります。また、彼らは[あなたは 'malloc()'の結果をCでキャストしてはいけないと言います(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – MikeCAT

+0

ああ、この場合、 '+'演算子を得るためにはキャストが必要です。 – MikeCAT

+0

このコードは、未定義の可能性があります。 'malloc()'が 'NULL'を返した場合、プログラムは予期しない動作をします。 'malloc()'が有効なポインタを返す場合にのみ、すべての動作を説明することができます。 –

答えて

1
// Allocate a number of floats in memory 
// t points to the second allocated float due to "1 + ..." 
float *t = 1 + (float *) malloc(sizeof(float) * sizeof(float)); 

// t now points to the first allocated float 
t--; 

// first allocated float is set to 8.0 
*t = 8.0; 

// second allocated float is set to 2.0 (i.e. 8.0/4.0) 
// note: t[1] is the same as *(t + 1) 
t[1] = *t/4.0; 

// t now points to the second allocated float 
t++; 

// first allocated float is set to 1.0 (i.e. 2.0/2.0) 
// note: t[-1] is the same as *(t - 1) 
t[-1] = *t/2.0; 

// Prints 2.0 as t still points to the second allocated float 
printf("%f\n",*t); 

// Decrement t, i.e. t points to first allocated float 
// and free the memory 
free(--t); 

// End the program by returning from main 
return 0; 
+0

それはそれについてカバーします。コメント上の個人的なスタイルだけで、 '/ * stuff * /'私は一般的に目ではなく、彼自身のものの方が簡単です。 –

+0

@ DavidC.Rankin小さな一行コメントに '/ * * /'を使うのは、コメントが存在するコード全体を「コメントアウト」することができないためです。例えば、 '/ * stuff/* things */* /'のような "再帰的なコメント"はCの標準では許されていないと私は信じています。 – Lundin

+0

うーん...私はあなたが言っていることを得て、一行と複数行のコメントの両方の使用を理解していますが、私のコメントに '/ * stuff/* things */* /'それは言わないで、ちょうど私があなたのコメントの意図に関して少し頭を傷つけていると言っています。 –

関連する問題