C语言如何打印内存地址的值?就像UE那样

时间:2023-02-06 01:10:53
比如说我输入"a" 打印出来 61
输入"我",打印出来"CE D2"

我的意思就是打印内存地址的真正的值

18 个解决方案

#1


这样大小端的输出结果应该是不同的

#2


VC的话 调试时 打开内存界面查看

#3


调试界面我肯定知道怎么查,问题是我做手机开发的时候放到真机上是无法查看当时的内存信息的,想打印出来,现在不知道该如何打印这个值

#4


调试界面我知道怎么打开,问题在于我做手机开发的时候手机上的调试过程,没有办法查看手机端的内存情况,想要打印出来,该如何操作?

#5


字符串没有大小端之分,都是按顺序来.

#6


好吧我修正下我的说法
char* a="我";
我希望写一个void printStr(char* str);
调用printStr(a);
输出结果是   "CE D2 00 00"
而不是       "我"

#7


void printStr(char* str)
{
  while(*str != 0)
     printf("%02X ", *str++);
}

#8


按照ansi字符集.结尾符也只会有1个. ce de 00

#9


引用 7 楼 adlay 的回复:
void printStr(char* str)
{
  while(*str != 0)
  printf("%02X ", *str++);
}


好像是对的

#10


p
void *; print as a pointer (implementation-dependent representation).


int i;
 
printf("%p ", &i);

#11


你问的不对,你应该问如何以16进制值打印
%x是打印以16进制格式打印
7楼是对的,不过会有大端小端问题

#12


打印ASCII码?

scanf("%c", &ch);
printf("The code for %c is %d.\n", ch, ch);

#13


C语言如何打印内存地址的值?就像UE那样

#14


仅供参考
void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%03d %04x -",cn,i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

#15


该回复于2012-02-16 11:15:56被版主删除

#16


你先把地址打印在一个日志里面 然后自己查看不就行了?
不一定非得打在屏幕上吧。

#17


void printHexString(const char* str,int size)
{
char line[17];
char* pc;
int ix;
int jx;
for (ix=0;ix<size;ix+=16)
{
dl_printf("%.8xH:",ix);
//打印十六进制
for (jx=0;jx!=16;jx++)
{
if (ix+jx>=size)
{
dl_printf("   ");
}
else
{
dl_printf("%.2X ",(unsigned char)*(str+ix+jx));
}
}
//打印字符串
{
memcpy(line,str+ix,16);
pc=line;
while (pc!=line+16)
{
if ((*pc=='\n') || (*pc=='\t'))
{
*pc=' ';
}
else if ((unsigned char)*pc < 0x10)
{
*pc='.';
}
pc++;
}
line[16]='\0';
dl_printf(" ; %s\n",line);
}
}
}

费了半天劲吧这个打出来了,非常感谢hongwenjun

#18


引用 14 楼 zhao4zhong1 的回复:
仅供参考

C/C++ code
void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%03d %04x -",cn,i);
   ……


sprintf(binstr,"%03d %04x -",cn,i);
这里的cn没有定义,应该是什么?

#1


这样大小端的输出结果应该是不同的

#2


VC的话 调试时 打开内存界面查看

#3


调试界面我肯定知道怎么查,问题是我做手机开发的时候放到真机上是无法查看当时的内存信息的,想打印出来,现在不知道该如何打印这个值

#4


调试界面我知道怎么打开,问题在于我做手机开发的时候手机上的调试过程,没有办法查看手机端的内存情况,想要打印出来,该如何操作?

#5


字符串没有大小端之分,都是按顺序来.

#6


好吧我修正下我的说法
char* a="我";
我希望写一个void printStr(char* str);
调用printStr(a);
输出结果是   "CE D2 00 00"
而不是       "我"

#7


void printStr(char* str)
{
  while(*str != 0)
     printf("%02X ", *str++);
}

#8


按照ansi字符集.结尾符也只会有1个. ce de 00

#9


引用 7 楼 adlay 的回复:
void printStr(char* str)
{
  while(*str != 0)
  printf("%02X ", *str++);
}


好像是对的

#10


p
void *; print as a pointer (implementation-dependent representation).


int i;
 
printf("%p ", &i);

#11


你问的不对,你应该问如何以16进制值打印
%x是打印以16进制格式打印
7楼是对的,不过会有大端小端问题

#12


打印ASCII码?

scanf("%c", &ch);
printf("The code for %c is %d.\n", ch, ch);

#13


C语言如何打印内存地址的值?就像UE那样

#14


仅供参考
void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%03d %04x -",cn,i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

#15


该回复于2012-02-16 11:15:56被版主删除

#16


你先把地址打印在一个日志里面 然后自己查看不就行了?
不一定非得打在屏幕上吧。

#17


void printHexString(const char* str,int size)
{
char line[17];
char* pc;
int ix;
int jx;
for (ix=0;ix<size;ix+=16)
{
dl_printf("%.8xH:",ix);
//打印十六进制
for (jx=0;jx!=16;jx++)
{
if (ix+jx>=size)
{
dl_printf("   ");
}
else
{
dl_printf("%.2X ",(unsigned char)*(str+ix+jx));
}
}
//打印字符串
{
memcpy(line,str+ix,16);
pc=line;
while (pc!=line+16)
{
if ((*pc=='\n') || (*pc=='\t'))
{
*pc=' ';
}
else if ((unsigned char)*pc < 0x10)
{
*pc='.';
}
pc++;
}
line[16]='\0';
dl_printf(" ; %s\n",line);
}
}
}

费了半天劲吧这个打出来了,非常感谢hongwenjun

#18


引用 14 楼 zhao4zhong1 的回复:
仅供参考

C/C++ code
void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%03d %04x -",cn,i);
   ……


sprintf(binstr,"%03d %04x -",cn,i);
这里的cn没有定义,应该是什么?