5

私は C でポインターを学習しようとしていますが、その概念を経験しました。このラボの質問に出くわし、その解決策を書き込もうとしました。

/* p1.c 
Write a short C program that declares and initializes (to any value you like) a 
double, an int, and a char. Next declare and initialize a pointer to each of 
the three variables. Your program should then print the address of, and value 
stored in, and the memory size (in bytes) of each of the six variables. 
Use the “0x%x” formatting specifier to print addresses in hexadecimal. You 
should see addresses that look something like this: "0xbfe55918". The initial 
characters "0x" tell you that hexadecimal notation is being used; the remainder 
of the digits give the address itself. 
Use the sizeof operator to determine the memory size allocated for each 
variable. 
*/

ただし、プログラムをコンパイルすると、2 つの主要なエラー カテゴリがあります。

  1. printf ステートメントのフォーマット プレースホルダーがすべて間違っているようです。私は、メモリ アドレスを %x または %p で出力できるという印象を受けました。しかし、私のプログラムでは、どちらもコンパイラの警告を生成しました。私は理解できませんでした - 以前のプログラムの一部で %p が警告なしに機能した理由と、ここで %x と %p の両方が機能しなかった理由。どのプレースホルダーがどのデータ型で機能するかについて、誰かが私を助けてくれますか?

  2. もう 1 つの大きな問題は、ポインターを文字変数に割り当てることです。このプログラムを実行すると、プログラムの 3 番目の printf ステートメントでセグメンテーション違反が発生します。なぜそうなのかはわかりません-

私が正しければ、このような宣言-

char array[]="Hello World!"

char *ptr=array

文字ポインタ変数ptrが配列変数の最初の要素を指すように設定しますarray。したがって、理想的には、*ptrを示し'H'*(ptr+1)を示します'e'

同じロジックに従って、var3charを持つ文字変数がある場合'A'、ポインター変数がそれを指すようにするにはどうすればよいptr3でしょうか?

これが私が書いたプログラムです-

#include<stdio.h>

int main()
{
int var1=10;
double var2=3.1;
char var3='A';

int *ptr1=&var1;
double *ptr2=&var2;
char *ptr3=&var3;

printf("\n Address of integer variable var1: %x\t, value stored in it is:%d\n", &var1, var1);
printf("\n Address of double variable var2: %x\t, value stored in it is:%f\n", &var2, var2);
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3);

printf("\n Address of pointer variable ptr1: %x\t, value stored in it is:%d\n", ptr1, *ptr1);
printf("\n Address of pointer variable ptr2: %x\t, value stored in it is:%f\n", ptr2, *ptr2);
printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3);

printf("\n Memory allocated for variable var1 is: %i bytes\n", sizeof(var1));
printf("\n Memory allocated for variable var2 is: %i bytes\n", sizeof(var2));
printf("\n Memory allocated for variable var3 is: %i bytes\n", sizeof(var3));

printf("\n Memory allocated for pointer variable ptr1 is: %i bytes\n", (void *)(sizeof(ptr1)));

return 0;
}

どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

6

charprintf 指定子がis %c (not )であることを除いて、すべて正しい%sです。

同じロジックに従って、var3charを持つ文字変数がある場合'A'、ポインター変数がそれを指すようにするにはどうすればよいptr3でしょうか?

答えはコードを参照してください。

ただし、他の printf ステートメントでいくつかの型の不一致があります。%iに使用する最後のもので(void *)は、そこで何を考えていたのかわかりません。

sizeof使用の結果を出力するには%zu(そして にキャストしないでvoid *ください)、これは最後の 4 つの printf ステートメントに適用されます。

他のステートメントでは%x、住所を印刷するために使用します。これは間違っています(あなたのコースもこれをアドバイスするのは間違っています)。%p住所を印刷するために使用する必要があります。

技術的には、アドレスも にキャストする必要がありますがvoid *、最新のシステムではすべてのポインターのサイズと表現が同じであるため、キャストしなくても問題ありません。

于 2014-06-09T02:20:16.917 に答える
1
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3);

printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3);

これがあなたの問題ですprintfと it 引数を正確に見てください:

%s、%s はstringの出力に使用しています。

文字列とは

文字列は、 0+ 文字と '\0'文字で定義されます。

ここで何が問題なのですか?

Var3charとして宣言されているため、stringではありません

printfは何をしようとしていますか? あなたの記憶を見てみましょう :

(aa125121) (メモリランダムアドレス) 65 aa aa aa

  • 太字はあなたの性格です
  • aa aa aaは別のプログラムメモリ

printfは 65 で読み取りを試行し、成功します (印刷します)

printfが'\0' またはその他の文字値を読み取ろうとしていますBAMMM セグメンテーション違反

プログラムが間違ったメモリ アドレスにアクセスしている。

解決策:

%cを使用

于 2014-06-09T02:29:22.283 に答える
0

あなたのタスクは0x%x指定子\フォーマットを使用する必要があるため、印刷の最初の文字列は次のようになります。 printf("\n Address of integer variable var1: 0x%x\t, value stored in it is:%d\n", (unsigned int)&var1, var1); 次に、同じ方法を理解すると思います。

于 2014-06-09T02:23:08.200 に答える