1

我正在尝试制作一个打印多个连续内存位置内容的小型应用程序。作为程序在内存中位置的指示,我正在打印主函数和虚拟变量的内存位置。

在第一列中,我想打印地址。在第二列中,我想要这个地址的内容和它后面的 9 个地址的内容。在第三列中,如果它是可打印的,我想将字节值打印为字符。如果它不可打印,我想打印一个点。在第一行下的行中,我做的完全一样。

在启动时,可以输入许多要打印的值。如果输入正值,地址将增加,如果输入负值,地址将减少。

为了快速查看我想要到达的位置,您可以运行代码并输入例如 20 个字节来转储并使用虚拟地址作为起始地址。

到目前为止,我的代码只适用于正值。当我输入一个负数时,我得到一个分段错误,但我不知道为什么。我试图在 Valgrind 中找到错误,但没有成功。

一些帮助将不胜感激!

这是我的代码:

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

#define NUMBER_OF_BYTES 10

void showAddresses(void);
void printMemory(void);
void getDumpSize(void);

char* dummy;                // dummy is een pointer naar een int
signed int dumpSize;            // how many bytes have to be dumped?
signed int upDown;          // do I need to go up or down?


int main(void)
{
    dummy = (char *) malloc (sizeof(unsigned char));// memory allocation
    showAddresses();    // prints the main function address and a variable address
    getDumpSize();  //      
    printMemory();  //
    free(dummy);        // free memory
    return 0;       // end the main function
}

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

void getDumpSize(void)
{
    printf("Enter number of bytes to dump <negative or positive>:");
    scanf("%d",&dumpSize);
    if(dumpSize<0)
    {
        upDown = -1;        // count down
        printf("upDown was set to -1\n");
    }
    else
    {
        upDown = 1;         // count up
        printf("upDown was set to +1\n");
    }
}

void printMemory(void)
{
    int input;
    printf("Enter the address:");
    scanf("%x", &input);                // enter the input
    printf("Address \tBytes \t\t\t\tChars \n"); // print the table header
    printf("--------- \t----------------------------- \t---------- ");
    int i;
    unsigned char* address;         // 
    for(i=0;i<abs(dumpSize);i++)
    {
        address = (unsigned char*) (input+(i*upDown));  // make the address to print
        if( (i%NUMBER_OF_BYTES) == 0)   // show the address every 'i*NUMBER_OF_BYTES' times
        {
            printf("\n%p \t", (void*) address); 
        }

        printf("%02x ", *address);  // print as a 2 number hex and use zero padding if needed


        if( (i%NUMBER_OF_BYTES) == (NUMBER_OF_BYTES-1) )// print the char list for every value (if printable)
        {
            printf("\t");
            int j;
            for(j=(NUMBER_OF_BYTES-1);j>=0;j--)
            {
                address = (unsigned char*) (input+(i*upDown)-j); 
                if(isprint(*address)==0)// print a dot if the byte value is not printable
                {
                    printf(".");
                }
                else
                {
                     printf("%c",*address); // print the byte value as a char, if printable
                }
            }
        }
    }
}
4

1 回答 1

1

您的分段错误可能来自尝试访问程序范围之外的内存。“dummy”中的地址是您程序中的第一个 malloc,因此它代表(可能)您的程序可用的第一个内存“区域”。从那里往上走可能会把你留在程序空间中(因此没有段错误),但往后走可能会把你带到一个受限的内存区域。出于好奇:为您的“虚拟”malloc 返回的内存地址是什么?这个数字是否大到足以倒退而不会变成负数?(我想知道您的程序是否看到真正的系统内存映射或已经为程序沙盒的分页映射。)

于 2013-03-13T08:12:15.143 回答