[问题] C的printf输出memory location问题

楼主: kiwistar (神汁手)   2016-01-10 03:14:28
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Code Block
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
预期按位元输出该内存位址(by byte)的值,但得到乱数ffffffff
详见下方
喂入的资料(Input):
255
预期的正确结果(Expected Output):
前面部分是测试码所以省略
后面输入255
预期会得出
(内存位址) ff
(内存位址) 00
(内存位址) 00
(内存位址) 00
错误结果(Wrong Output):
(内存位址) ffffffff
(内存位址) 00
(内存位址) 00
(内存位址) 00
程式码(Code):(请善用置底文网页, 记得排版)
#include <stdio.h>
void printByte(char*, int);
void printInt(int);
void main()
{
char c;
int i;
int ex;
scanf("%c %d",&c, &ex);
//printf("%p is the original location\n", &a);
// for (i = 0; i < 4; i++)
printByte(&c, sizeof(i));
printInt(ex);
//printByte(&a, i);
return;
}
void printByte(char* a, int len)
{
int i;
printf("\n");
for(i = 0; i < len; i++)
{
printf("%p\t%.2x\n", a + i, *(a + i));
}
}
void printInt(int s)
{
printByte((char*)&s, sizeof(s));
}
补充说明(Supplement):
我不知道为何输出一个byte为何会输出八位
如果输入12345
会得到:
(内存位址) 39
(内存位址) 30
(内存位址) 00
(内存位址) 00
这是正确的
但输出某些数字,例如:1234567
就会得到
(内存位址) ffffff87
(内存位址) ffffffd6
(内存位址) 12
(内存位址) 00
1234567转为16进位是12D687
所以基本上这个是正确的结果,但不晓得为何前面会多出一堆f
但有时会出现,有时又不会......
感谢!!
作者: winken2004 (新竹肥宅)   2016-01-10 03:54:00
前面会出现f是因为signed extension
楼主: kiwistar (神汁手)   2016-01-10 03:57:00
后来我发现,只要输入的数字 &256>=128就会出现那堆f
作者: winken2004 (新竹肥宅)   2016-01-10 04:01:00
改成void printByte(unsigned char* a, int len)*(a + i)的值只有1byte, %x是int有4byte
楼主: kiwistar (神汁手)   2016-01-10 04:42:00
原来如此,google了一下,我懂了,感谢!!

Links booklink

Contact Us: admin [ a t ] ucptt.com