1
char* pointer;
char array[10];

2番目のメモリはすでにバッファに割り当てられていることを知っています。しかし、メモリ割り当てに関してポインターがどのように機能するかは正確にはわかりません。プログラマーが malloc または calloc を使用してポインターを割り当てる前に、ポインターが最初に使用するスペースはどれくらいですか? さらに、このように初期化すると

char* pointer;
pointer = "Hello World!";

ランダムな文字列サイズで初期化される前にメモリが割り当てられていない場合、これはどのように初期化されていますか? エラーは発生しませんか?

私は、ポインターと配列を機械的にプログラミングしているだけで、コンピューター内でどのように機能するかを本当に知りませんでした。そして、より良いプログラミングの練習のために、これを完全に理解する必要があると思いました.

4

7 に答える 7

3

ポインターは、1 つの変数のアドレスを格納するだけです。つまり、char* と指定すると、1 文字のアドレスが格納されます。int i=9; のように sizeof(int) のメモリが予約されており、プログラムで「i」としてラベル付けされていることを意味します。賢明な char* c; のように。size(char*) のメモリが予約されており、「c」とラベル付けされていることを意味します。in c="こんにちは"; 「h」、「e」、「l」、「l」、「o」には、個別の「連続」メモリが割り当てられました。ポインター c は最初の文字 "H" を指します。

メモリ内で考慮する HELLO は、文字列 "India" の前に格納されます。

「ハローインディア」

for char *c="HELLO"; c[5] は I を返します。 for char c[5]="HELLO"; c[5] は範囲外エラーの配列です。

于 2013-03-11T05:51:47.043 に答える
2

char array[10] , It will reserve memory of 10 bytes on stack frame of function in which you have declared it.

Whereas in char *ptr = "hello" ptr will get 4 bytes memory on stack in 32 bit O.S,also "hello" is string literal which will get stored on non-bss part of your executable,and ptr is pointing to it from stack frame.

于 2013-03-11T05:38:59.610 に答える
1
  1. この宣言:

    char *pointer;
    

    sizeof(char *)ポインター値用にバイトを予約します。他のメモリは割り当てられません。

  2. この宣言:

    char array[10];
    

    配列用に 10 バイトを予約します。

  3. この場合:

    char *pointer;
    pointer = "Hello World!";
    

    メモリ内のどこかにある文字列リテラルを指す単一のポインター (sizeof(char *)サイズ) がまだあります。他の割り当ては行われません。文字列リテラルのストレージは、コンパイル時にツールチェーンによって処理されます。

于 2013-03-11T05:27:46.357 に答える
1

ポインタと配列はまったく別のものです。この 2 つの類似点や混乱は、C 言語の産物です。

ポインターは、別の変数の場所を保持する変数です。配列 (C の場合) は、同じ型の値の集合体であり、メモリ内に連続して割り当てられます。

配列は、基本要素へのポインタに対する算術演算によってアクセスされます[0]。配列を参照する式が評価される場合、出現する値は element へのポインター[0]です。

int array[10];
int *p = array;     /* array expression yields pointer to array[0] */
int *q = &array[0]; /* q also points to same place as p */

C の配列表記は、実際にはポインターで機能する偽物です。構文E1[E2]は と同じことを意味します*(E1 + E2)(E1 と E2 が十分に括弧で囲まれているため、結合性と優先順位に惑わされる必要はありません)。 を介して要素のアドレスを取得する場合&E1[E2]、これは と同じ&*(E1 + E2)です。address-of と dereference は「取り消す」ままにしE1 + E2ます。したがって、これらも同等です。

int *r = array + 3;
int *q = &array[3];

array[i]とは両方とも有効な構文であるためpointer[i]、初心者段階 (構文をセマンティクスと誤解している) の人々は、配列とポインターが何らかの形で同じものであると結論付けます。

アセンブリ言語でのプログラミングに時間を割いてください。アセンブリ言語では、次のようなストレージを定義できます。

 A: DFS 42          ;; define 42 words, labelled as A.

次に、次のように使用します。

 MOV R13, A         ;; address of A storage is moved into R13
 MOV R1, [R13 + 3]  ;; load fourth word, A[3]

R13 はストレージを指します。それは Aがポインタであることを意味しません。A はストレージの名前です。もちろん、ストレージを使用するには、その実効アドレスが必要なので、A への参照はそれに解決されます。コードがアセンブルされてリンクされると、そのMOV命令は最終的に数値アドレスを R13 にロードします。

C は単なる高レベルのアセンブリ言語です。配列は、実効アドレス (ポインター データ型) に解決される名前付きストレージのようなものです。

配列は常に実効アドレスに解決されるとは限りません。sizeof aは配列のサイズをaバイト単位でsizeof p計算しますが、ポインター データ型のサイズを計算しますp

もう 1 つの違いは、配列の名前でその配列以外の場所を参照することはできませんが、値をポインターに代入できることです。

array++;           /* invalid */
array = &array[0]; /* invalid */
p = &array2[0];    /* valid */
p++;               /* valid: point to the next element in array2 */
于 2013-03-11T05:51:29.640 に答える
0

ポインタは、メモリ位置を記述するために必要なスペースをすべて占有します。一般に(常にではありませんが)、ポインターのサイズはプロセッサー/ OS /プログラムモードのビットサイズと同じです(たとえば、64ビットOS上の64ビットプログラムの場合は8バイト、 32ビットプログラムなど)。あなたはこれを使って見つけることができます

sizeof (void *)

の場合

char* pointer;
pointer = "Hello World!";

R / Wメモリに1つのポインタが割り当てられ、さらにR / Oメモリに文字列用のスペース(末尾のヌルバイトを含む13バイト)が割り当てられます。メモリ内の次のオブジェクトが1バイトよりも適切に配置されている場合はさらに多くなります。境界)。同じR/Oスペースが割り当てられることに注意してください

printf("Hello World!");

つまり、実際にはポインタとは何の関係もありません。実際、ほとんどの最適化コンパイラは、2つの文字列がまったく同じであり、R/Oメモリに1回だけ割り当てることに気付くでしょう。

于 2013-03-11T05:36:03.760 に答える
0

メモリ割り当てに関してポインタがどのように正確に機能するかはわかりません。プログラマーがmallocまたはcallocを使用してポインターを割り当てる前に、ポインターは最初にどのくらいのスペースを必要としますか?

ポインタ自体は、int、char...などの単なるデータ型です。メモリアドレス(またはNULL)を指します。

それはmallocである可能性があり、あなたが求めるメモリのブロックへのポインタポイントになります。

ポインタ=mallocと間違えた可能性が非常に高いですが、そうではありません。

于 2013-03-11T05:36:39.190 に答える
0

cでポインタを定義する場合、たとえばchar * c; またはint*iは、それぞれsizeof(char *)およびsizeof(int *)に等しいメモリを予約します。

ただし、実際に予約されるメモリはシステム/ OSによって異なります。64ビットの場合は8バイトを予約し、32ビットの場合は4バイトを予約します。

char * c="Helloworld"を宣言する場合;

文字列「Helloworld」はメモリ内のどこにでも格納できますが、ここでcは文字列の最初の文字である「H」を指します。

于 2013-03-11T05:37:59.717 に答える