C 언어 - 배열/구조체 초기화

5648 단어 독서 노트C 기초
먼저 코드를 보십시오.
typedef struct{
    char MerchantID[128]; 
    char MobileToken[36]; 
}Test_Data;

void testStructInit()
{	
	Test_Data struData = {1};

	int i;
	for (i = 0 ; i < sizeof(struData); i ++)
	{
		printf("%02x ", (char)*(((char *)&struData) + i));
	}
	printf("
"
); return; } int main(void) { testStructInit(); return 0; }

질문:
함수testStructInit에 대한 정의와 초기화 문장:struData={1};
  • 첫 번째 원소를 초기화한 다음에 또 다른 동작이 있습니까?
  • 이렇게 쓰면 TestData struData = {1} 은요?

  • 먼저 결론을 말하다.
    TestData struData = {1} 또는 TestData struData = {1}은 첫 번째 요소를 초기화하는 것 외에 이 변수의 모든 다른 요소를 0으로 초기화합니다.
    코드 분석:
  • 직관적인 printf를 통해 변수의 모든 요소를 출력할 수 있다. vc6, gcc에서 테스트를 하면 이 두 가지 상황에서 나머지 모든 요소는 0으로 초기화된다.
  • 어셈블리 분석을 통해TestData struData = {1} 이 줄의 문장에 대응하는 어셈블리 언어는 다음과 같습니다.
    106:      Test_Data struData = {1};
    
    0040133E C6 85 5C FF FF FF 01 mov         byte ptr [ebp-0A4h],1
    00401345 B9 28 00 00 00       mov         ecx,28h
    0040134A 33 C0                xor         eax,eax
    0040134C 8D BD 5D FF FF FF    lea         edi,[ebp-0A3h]
    00401352 F3 AB                rep stos    dword ptr [edi]
    00401354 66 AB                stos        word ptr [edi]
    00401356 AA                   stos        byte ptr [edi]
    
  • 해당 어셈블리의 설명은 다음과 같습니다.
    mov         byte ptr [ebp-0A4h],1 //      1,        。   C         。
    mov         ecx,28h 			//ecx     28h,ecx      (counter),    (REP)     LOOP        。
    xor         eax,eax 	// eax      0
    lea         edi,[ebp-0A3h] 	// edi    struData     
    rep stos    dword ptr [edi] //   eax     edi     ,     ecx  。
                                //       , dword,4   
    stos        word ptr [edi] 	// word  , 2   ,eax     edi     
    stos        byte ptr [edi] 	// byte  , 1   ,eax     edi     
    //      ,      :
    //                ,  ,             sizeof(struData)-1
    //      A4h-1=A3h   , CPU   dword(4  )        ,
    rep stos    dword ptr [edi]	//       4*28h, A0h   。
    							//   3   ,              。
    mov         byte ptr [ebp-0A4h],1 -> |      |
    rep stos    dword ptr [edi]       -> |        (   4    )|
    stos        word ptr [edi]        -> |  3  ,      2   (word)|
    stos        byte ptr [edi]        -> |    1  ,   byte   |
    

    좋은 웹페이지 즐겨찾기