int main( int argc, char **argv) // char **argv -> char *argv[]
{
char *ip_adrs = argv[1];
unsigned short unit = (short)(argv[2]);
unsigned short reg_no = (short)(argv[3]);
unsigned short num_regs = (short)(argv[4]);
printf(“ip_adrs = %s unit = %d reg_no = %d num_regs = %d\n”,
ip_adrs, unit, reg_no, num_regs);
}
对以上程序运行后,打印以下结果:
前面都好理解,unit为字符5的ascii码,reg_no为字符0的ascii码,但对于num regs的值感到很困惑,不理解12337是什么值,为什么字符10会打印出12337
为了排查问题,添加以下代码:
cout << typeid(argv[2]).name() << endl; type: char *
cout << typeid(argv[3]).name() << endl; // type: char *
cout << typeid(argv[4]).name() << endl; // type: char *
以上看出,argv[]中的元素都是指向字符的指针,既然指向字符,那么指向内容占一个字节,若此时打印argv[4]内容,可以看到以下结果:
也就是argv[4]本来指向的是ascii码的字符1,那为何转换成short后变成了12337呢,分析这个问题,添加了以下代码:
cout << typeid(num_regs).name() << endl; // type: unsigned short
cout << sizeof(num_regs) << endl; // size: 2
以上可以看出num_regs是占两个字节的short类型,也就是argv[4]被强制转换为了指向两个字节的指针, 本来*argv[4] = 0x31 *argv[4]+1 = 0x30,现在变成了
*argv[4] = 0x3031,因此打印num_regs的值就是0x3031的值了