首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言,结构体有关问题

2013-04-20 
C语言,结构体问题#include stdio.hstruct a{char name[10]int age}aa[3]{{abc,20},{def,21},{gh

C语言,结构体问题
#include <stdio.h>
struct a{
char name[10];
int age;
}aa[3]={{"abc",20},{"def",21},{"ghi",22}};

int main(int argc, char *argv[])
{
struct a *paa=aa;
printf("%c\n",(*(paa+1)).name[0]);
printf("%c\n",(*paa++).name[1]);
printf("%c\n",(*(paa+1)).name[2]);

//printf("%c%c%c",(*(paa+1)).name[0],(*paa++).name[1],(*(paa+1)).name[2]);
return 0;
}
上面的3个 printf的结果,按道理因该和下面的printf的结果相同啊。
实际是,使用上面3个printf的结果为dbi,    使用下面一个printf(注释掉上面3个)的结果为gbf

求解释 C Structure printf
[解决办法]
刚试验了下确实是这个样子,估计应该是和调用printf参数压栈有关,不信你用三个指针接收printf计算的指针,在printf打印中使用计算好的指针打印就没有问题。
有点像下面的宏

#define max(a, b) a>b?a:b

int a=1;
int b=2;

int c = max(a++, ++b);


这个是汇编代码
printf("%c\n",(*(paa+1)).name[0]);
012CB5F5  mov         eax,dword ptr [paa] 
012CB5F8  movsx       ecx,byte ptr [eax+10h] 
012CB5FC  mov         esi,esp 
012CB5FE  push        ecx  
012CB5FF  push        offset string "%c\n" (12D0BD4h) 
012CB604  call        dword ptr [__imp__printf (12D5574h)] 
012CB60A  add         esp,8 
012CB60D  cmp         esi,esp 
012CB60F  call        @ILT+1350(__RTC_CheckEsp) (12C154Bh) 
printf("%c\n",(*paa++).name[1]);
012CB614  mov         eax,dword ptr [paa] 
012CB617  movsx       ecx,byte ptr [eax+1] 
012CB61B  mov         dword ptr [ebp-148h],ecx 
012CB621  mov         edx,dword ptr [paa] 
012CB624  add         edx,10h 
012CB627  mov         dword ptr [paa],edx 
012CB62A  mov         esi,esp 
012CB62C  mov         eax,dword ptr [ebp-148h] 
012CB632  push        eax  
012CB633  push        offset string "%c\n" (12D0BD4h) 
012CB638  call        dword ptr [__imp__printf (12D5574h)] 
012CB63E  add         esp,8 
012CB641  cmp         esi,esp 
012CB643  call        @ILT+1350(__RTC_CheckEsp) (12C154Bh) 
printf("%c\n",(*(paa+1)).name[2]);
012CB648  mov         eax,dword ptr [paa] 
012CB64B  movsx       ecx,byte ptr [eax+12h] 


012CB64F  mov         esi,esp 
012CB651  push        ecx  
012CB652  push        offset string "%c\n" (12D0BD4h) 
012CB657  call        dword ptr [__imp__printf (12D5574h)] 
012CB65D  add         esp,8 
012CB660  cmp         esi,esp 
012CB662  call        @ILT+1350(__RTC_CheckEsp) (12C154Bh) 
paa=aa;
012CB667  mov         dword ptr [paa],offset aa (12D4070h) 
printf("%c%c%c",(*(paa+1)).name[0],(*paa++).name[1],(*(paa+1)).name[2]);
012CB66E  mov         eax,dword ptr [paa] 
012CB671  movsx       ecx,byte ptr [eax+1] 
012CB675  mov         dword ptr [ebp-148h],ecx 
012CB67B  mov         edx,dword ptr [paa] 
012CB67E  add         edx,10h 
012CB681  mov         dword ptr [paa],edx 
012CB684  mov         eax,dword ptr [paa] 
012CB687  movsx       ecx,byte ptr [eax+12h] 
012CB68B  mov         esi,esp 
012CB68D  push        ecx  
012CB68E  mov         edx,dword ptr [ebp-148h] 
012CB694  push        edx  
012CB695  mov         eax,dword ptr [paa] 
012CB698  movsx       ecx,byte ptr [eax+10h] 
012CB69C  push        ecx  
012CB69D  push        offset string "%c%c%c" (12D0BCCh) 
012CB6A2  call        dword ptr [__imp__printf (12D5574h)] 
012CB6A8  add         esp,10h 
012CB6AB  cmp         esi,esp 
012CB6AD  call        @ILT+1350(__RTC_CheckEsp) (12C154Bh) 



热点排行