3

次のCの問題を教えてください。特定のメモリ アドレスから始まる 30 個の連続する値のリストを出力しようとしています。メモリ ロケーションごとに 1 バイトを 16 進数として出力したいと思います。挿入するメモリ アドレスの目安として、プログラムの開始時にダミーのアドレスを出力しています。

問題は、1 バイトを超える値を取得することです。ゼロの長いシーケンスの場合、これでも 00 になりますが、ゼロ以外の値が表示されるとすぐに、4 バイトの「ウィンドウ」が出力されます。これにより、次の出力が得られます。

Main function address is 0x8048494 
Dummy variable address is 0x9a2e008 
Enter the address (without the 0x):9a2e008
You entered: 9a2e008 
Address     Byte value 
0x9a2e008   00 
0x9a2e009   00 
0x9a2e00a   00 
0x9a2e00b   00 
0x9a2e00c   00 
0x9a2e00d   00 
0x9a2e00e   00 
0x9a2e00f   00 
0x9a2e010   00 
0x9a2e011   f1000000 
0x9a2e012   ff10000     
0x9a2e013   20ff100 
0x9a2e014   20ff1 
0x9a2e015   3900020f 
0x9a2e016   61390002 
0x9a2e017   32613900 
0x9a2e018   65326139 
0x9a2e019   30653261 
0x9a2e01a   30306532 
0x9a2e01b   38303065 
0x9a2e01c   383030 
0x9a2e01d   3830 
0x9a2e01e   38 
0x9a2e01f   00 
0x9a2e020   00 
0x9a2e021   00 
0x9a2e022   00 
0x9a2e023   00 
0x9a2e024   00 
0x9a2e025   00

これまでの私のコードは次のとおりです。

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

#define NUMBER_OF_BYTES 10

void showAddresses(void);
void printMemoryAtAddress(void);

int * dummy;                                    
int dumpSize = 30;                                          

int main(void)
{
    dummy = (int *) malloc     (sizeof(int));                                       showAddresses();                                        
    printMemoryAtAddress();
    return 0;
}

void showAddresses(void)
{
    printf("Main function address is %p \n", main);
    printf("Dummy variable address is %p \n",(void*)dummy);
}

void printMemoryAtAddress(void)
{
    int input;
    printf("Enter the address (without the 0x):");
    scanf("%x", &input);
    printf("You entered: %x \n", input);
    printf("Address \tByte value \n");

    int i;
    for(i=0;i<dumpSize;i++)
    {
        int* address;
        address = (int*) (input+i);
        printf("%p \t", address);   
        printf("%.2x \n", *address);                                        
    }
}

この問題の助けをいただければ幸いです。この質問がばかげている場合は、申し訳ありません。(私はまだ学習中で、何時間も試しても解決策が見つからないようです!) ジョー

4

1 に答える 1

7

あなたの問題はここにあります:

void printMemoryAtAddress(void)
{
    int input;
    printf("Enter the address (without the 0x):");
    scanf("%x", &input);
    printf("You entered: %x \n", input);
    printf("Address \tByte value \n");

    int i;
    for(i=0;i<dumpSize;i++)
    {
        int* address;
        address = (int*) (input+i);
        printf("%p \t", address);   
        printf("%.2x \n", *address);                                        
    }
}

addressは int* ではなく unsigned char* でなければなりません。int* として、メモリを整数であるかのように読み取ります。1 バイトのみの char として読み取る必要があります。

幸運を!

于 2013-03-09T15:27:03.570 に答える