2011-07-27 121 views
1
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

struct info 
{ 
     int id; 
     char name[20]; 
}; 

int main() 
{ 
     struct info p; 
     struct info *ptr; 

     ptr = &p; 


     (*ptr).id = 20; 
     strcpy((*ptr).name, "Delluh"); 


     printf("\n %u %u %u\n\n",*ptr,ptr->id,ptr->name); 



     return 0; 

} 

最後一個printf語句給出'20 1819043140 26741'的輸出,其中20是正確值,其餘2個值是一些垃圾值。然而,在從ptr中刪除*時,我得到了一個地址值的正確輸出,然後是另一個地址值。任何人都可以告訴我爲什麼把*放在前面的ptr導致其他兩個值搞砸了?在嘗試打印C中的結構值時出現奇怪的O/P

回答

0

豈不更corrent如果你會使用這個

printf("\n %p %i %s\n\n",ptr,ptr->id,ptr->name); 

您在printf的所有參數使用%u(無符號整數),但你傳遞一個指針,整數和字符串參數我認爲這是你遇到的問題。 你應該看看printf documentation關於%s,%u,%i等參數的含義。

+0

是的,我知道這是正確的方法,但我只是想知道爲什麼把一個*導致其他2個值出錯。 – anto

0

因爲*那裏,你解引用的結構和傳遞整個事件在— ID和名稱& mdash。

printf使用可變參數,它基本上意味着您可以傳入任意類型的參數,但是這也意味着編譯器不會執行任何自動類型轉換或檢查(因爲它不會執行任何操作)噸知道什麼類型的期望)。所以你傳遞的參數最終只是堆棧中的一系列字節,格式字符串告訴printf如何解釋那個字節串。除此之外,它會告訴它需要跳過多少個字節才能進入下一個參數。

所以你想ptr->id第一個參數,它只有4個字節。但是你實際上傳遞了結構的所有24個字節作爲參數。因此,在printf完成將前4個字節作爲unsigned int打印後,它已準備好打印下一個參數,但仍然卡在名稱字段的開頭。如果你看,它打印的「垃圾」值是0x6C6C6544,它是4個ASCII字符「lleD」,它是你的字符串,被解釋爲小尾數整數。

一般來說,你可能只需通過解引用指針(指針指向結構體及其第一個字段)就可以脫離結構體的第一個字段,但只有當編譯器知道你就是你試圖根據類型來做。例如,這可能會工作:

int id = *ptr; 

技術上來說,至少可以workd,因爲編譯器知道什麼類型你實際上是試圖去。實際上,編譯器可能會發出錯誤或警告,並且您需要執行一些轉換。

相關問題