很久前寫的了,現在搬到這來了,現在看看此問題確實不是什么大問題~~
問:在Linux C 編程中 經常遇到的一個讓我有點費解的看似不難的一個小問題,,,求解釋。
答:如在SOCKET編程中的函數int bind(int sockfd,struct sockaddr*myaddr,int addrlen)中的的二個參數struct sockaddr*myaddr是一個指向結構體的指針,對吧?調用bind()程序如下bind(sockfd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in)) ,(addr是自己定義的一個struct sockaddr_in結構體)
-------------------------------
問:我想問 (struct sockaddr*)&addr是什么意思???為什么前面加上(struct sockaddr*)???是強制轉換嗎???強制轉換成什么???為什么要強制轉換???直接&addr不可以嗎???
答:如在SOCKET編程中的函數int bind(int sockfd,struct sockaddr*myaddr,int addrlen)中的的二個參數struct sockaddr*myaddr是一個指向結構體的指針,對吧?調用bind()程序如下bind(sockfd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in)) ,(addr是自己定義的一個struct sockaddr_in結構體)
-------------------------------
問:我想問 (struct sockaddr*)&addr是什么意思???為什么前面加上(struct sockaddr*)???是強制轉換嗎???強制轉換成什么???為什么要強制轉換???直接&addr不可以嗎???
答:struct sockaddr是通用的套接字地址,而struct sockaddr_in則是internet環境下套接字的地址形式,二者長度一樣,都是16個字節。二者是並列結構,指向sockaddr_in結構的指針也可以指向sockaddr。一般情況下,需要把sockaddr_in結構強制轉換成sockaddr結構再傳入系統調用函數中。
int bind(int sockfd,struct sockaddr*myaddr,int addrlen);
聲明了此種結構體,避免編譯警告,強制類型轉換。對於追求完美的程序員肯定要避免任何警告。嚴謹的代碼風格。雖然兩個結構體是兩種概念的統一表達方式。具體參考apue socket編程。
int bind(int sockfd,struct sockaddr*myaddr,int addrlen);
聲明了此種結構體,避免編譯警告,強制類型轉換。對於追求完美的程序員肯定要避免任何警告。嚴謹的代碼風格。雖然兩個結構體是兩種概念的統一表達方式。具體參考apue socket編程。
++++剛剛又看了會書和代碼,再看看你給的這些解釋,感覺思維通了~ 在定義addr時,使用的是struct sockaddr_in addr,而函數bind()中的那個參數是struct sockaddr類型指針,所以要強制轉換下 避免產生警告。