求高手解释。。。
本帖最后由 CSON11 于 2012-12-09 17:46:59 编辑
#include <cstdio>
int main()
{
const char* p="a大"; //已知“大”的GB2312码:B4 F3;
printf("%p\n%p\n%p",p[0],p[1],p[2]); //可变长参数,char类型的变量的入栈转换原则是什么??
}
打印结果是:
00000061
FFFFFFB4
FFFFFFF3
printf()函数参数表是可变长参数。
请问:
一个字节的char变量入栈时如何转换为4个字节?
请解释以上代码的运行结果?
[解决办法]
应该是打印时格式化的问题,如果你用%c格式化printf就对了
[解决办法]
我把windows里面%p的代码运行流程给你贴出来:
case _T('p'):
/* write a pointer -- this is like an integer or long */
/* except we force precision to pad with zeros and */
/* output in big hex. */
precision = 2 * sizeof(void *); /* number of hex digits needed */
#if PTR_IS_INT64
flags
[解决办法]
= FL_I64; /* assume we're converting an int64 */
#elif !PTR_IS_INT
flags
[解决办法]
= FL_LONG; /* assume we're converting a long */
#endif /* !PTR_IS_INT */
/* DROP THROUGH to hex formatting */
case _T('X'):
/* unsigned upper hex output */
hexadd = _T('A') - _T('9') - 1; /* set hexadd for uppercase hex */
goto COMMON_HEX;
COMMON_HEX:
radix = 16;
if (flags & FL_ALTERNATE) {
/* alternate form means '0x' prefix */
prefix[0] = _T('0');
prefix[1] = (TCHAR)(_T('x') - _T('a') + _T('9') + 1 + hexadd); /* 'x' or 'X' */
prefixlen = 2;
}
goto COMMON_INT;
COMMON_INT: {
:::
l = (unsigned int) get_int_arg(&argptr); /* zero-extend*/
__inline int __cdecl get_int_arg (
va_list *pargptr
)
{
return va_arg(*pargptr, int);
}
#define va_arg _crt_va_arg
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
[解决办法]
&argptr即是你的a[x]
[解决办法]
这个有点难度,编译器的操作问题,可能会和你的认识出现些冲突的。针对你的第一个问题。