0

皆様、素晴らしい夏をお過ごしください!

私は現在、試験に向けて修正を行っており、過去の論文でいくつかの質問を考え出しました。:)

質問は次のとおりです。

1.) 関数 power() は関数を実装する必要がありますn* 2^p(行の出力は であるprintf()必要があります5*(2^2) = 20)。power()シフト演算子を使用して関数の本体を完成させます。で利用可能な累乗関数の代わりにシフト演算子を使用するのが賢明なのはなぜmath.hですか?

#include <stdio.h>

int power(int n, int p) {
    << YOUR CODE GOES HERE >>
}

main () {
    printf("%d*(2^%d) = %d\n",5,2,power(5,2));
}

2.) メモリは、テキスト、データ、スタック、およびヒープと呼ばれる領域に編成されます。以下のプログラムは、変数abおよび を定義しますc。各変数の内容はどのメモリ領域に存在しますか?

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

int a = 5;

int func1(int x) {
    int b=5;
}

main {
    char * c;

    c = (char*) malloc (a+1);
    func1(a);
    return 0;
}

他にもいくつか質問がありますが、どうなるか見てみましょう。私は実際にスタックオーバーフローを使用したことがないので、間違ったことをした場合は簡単に行ってください!

どうもありがとう、

ダン

4

3 に答える 3

1

1 -

質問は、シフト演算子を使用して私たちの力を働かせる方法を示すことを望んでいるためです。C ランタイム ライブラリの使用方法を知っていることを示すものではありません。

2

a - data
b - stack
c - stack

彼はおそらく c - heap を望んでいますが、そうではありません。c の内容はスタックにあります

于 2013-08-12T19:18:15.330 に答える
1

まず、学習するための最良の方法である独自のコードを記述させます。しかし、私はこれらの質問の背後にある理論に答えます...

1) 2 を n 乗すると、2 を n 回掛けることと同じになります。ただし、2 を掛けることは数値を 2 倍にすることと同じであり、コンピューターはその数値を基数 2 で格納します。たとえば、6 のバイナリ値 == 0b00110 ですが、すべてのビットが 1 だけ左にシフトされると、12 == 0b01100 になります。 、これは 6*2 と同じです。したがって、たとえば、16 == 4^2 = 4*4 = 4*(2*2) またはバイナリ 16 == 0b010000 == 0b001000*2 = (0b00100)*2*2.

2) 変数がすべてのルーチンの外で宣言されると、それは「グローバル」ストレージにあり、おそらく「データ」とも呼ばれます。変数がルーチン内で宣言されると、それは「自動」変数 (自動的であることを意味します) であり、スタックに割り当てられます。一例として、変数が明示的に割り当てmallocられると、ヒープに割り当てられます。

C では、ポインターには 2 つのデータ コンポーネントまたはストレージ要素があります。まず、通常は 4 バイトしか使用しないポインター自体です。次に、データに割り当てられた長さのデータ。これ以上言うと、他の回答によって提供される情報が繰り返されます。

freeこれは、ヒープに割り当てられたすべてのストレージに対する優れたプログラミング プラクティスです。ただし、システムはmain終了時にそのストレージの割り当てを解除する必要がありますが、特に小規模または組み込みシステムでは、これが常に保証されるわけではありません。したがって、コード例は次のように終了する必要があります。

    free(c);
    return 0;
于 2013-08-12T20:15:56.377 に答える
0

1>

#include <stdio.h>


int power(int n, int p) 

{

return n<<p; // p is the number of bits left-shifted
}

main () 

{
printf("%d*(2^%d) = %d\n",5,2,power(5,2));
}

2>

a: データ b: スタック c: スタック

于 2013-08-12T19:56:59.230 に答える