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)