Memory 从内存打印值列表时出现分段错误

Memory 从内存打印值列表时出现分段错误,memory,printing,segmentation-fault,Memory,Printing,Segmentation Fault,我正在尝试制作一个小应用程序,它可以打印多个连续内存位置的内容。作为程序在内存中位置的指示,我正在打印主函数和虚拟变量的内存位置 在第一列中,我要打印地址。在第二列中,我想要这个地址的内容以及后面9个地址的内容。在第三列中,我想将字节值打印为字符(如果可以打印)。如果它不可打印,我想打印一个点。在第一行下面的行中,我做的完全相同 启动时,可以输入许多要打印的值。如果输入正值,地址将递增;如果输入负值,地址将递减 要快速查看我想要到达的位置,您可以运行代码并输入例如20个字节以转储,并使用虚拟地址

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

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

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

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

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

我们将非常感谢您的帮助

这是我的密码:

#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
                }
            }
        }
    }
}
#包括
#包括
#包括
#定义\u字节的数量\u 10
无效地址(无效);
无效打印存储器(void);
void getDumpSize(void);
char*dummy;//dummy是een指针naar een int
有符号整数转储大小;//必须转储多少字节?
签名整数向上向下;//我需要上升还是下降?
内部主(空)
{
dummy=(char*)malloc(sizeof(unsigned char));//内存分配
showAddresses();//打印主函数地址和变量地址
getDumpSize();//
printMemory()//
空闲(虚拟);//释放内存
返回0;//结束主函数
}
void显示地址(void)
{
printf(“主功能地址是%p\n”,Main);
printf(“伪变量地址为%p\n”,(void*)伪变量);
}
void getDumpSize(void)
{
printf(“输入要转储的字节数:”);
scanf(“%d”、&dumpSize);

如果(dumpSize您的分段错误可能来自尝试访问程序作用域之外的内存。“dummy”中的地址是程序中的第一个malloc,因此它表示(可能)程序可用内存的第一个“区域”。从那里向上可能会使您停留在程序空间中(因此不存在seg故障),但向后走可能会将您推入一个受限的内存区域。出于好奇:为“虚拟”malloc返回的内存地址是什么?该数字是否足够大,可以向后走而不返回负数?(我想知道您的程序是否看到了真实的系统内存映射或已为程序沙盒的分页映射。)

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

谢谢您的友好回复!我认为这确实是出了问题的地方。今天有人告诉我,因为虚拟变量是一个全局变量,它接近内存受限。这似乎只是分段错误的原因之一。我还在另一个系统上试过这段代码,发现它不起作用。我想我应该使用“lon”g int input'而不是'int input',因为在某些系统上,int的大小不足以容纳某些内存地址。感谢您的友好回复!我认为这确实是出了问题的原因。今天有人告诉我,由于虚拟变量是一个全局变量,它接近于受限内存。这似乎只是seg的原因之一错误。我还在另一个系统上尝试了这段代码,发现它不起作用。我认为我应该使用“长整数输入”而不是“整数输入”,因为在某些系统上整数的大小不足以容纳某些内存地址。