2013-01-22 81 views
6

請看看這個程序麻煩順便結構字面作爲函數參數

#include<stdio.h> 
#include<string.h> 

typedef struct hs_ims_msrp_authority 
{ 
    int  host_type; 
    char buf[50]; 
    int  port; 
}hs_i; 

int main() 
{ 
char dom[50]; 
int i = 10, j = 20; 
strcpy(dom, "ine"); 
fun((hs_i){i, dom, j}); // doesnt work 
fun((hs_i){i, "dom", j}); // this works 
} 

int fun(hs_i c) 
{ 
printf("%d %s %d\n", c.host_type, c.buf, c.port); 
} 

在調用主好玩的功能;當字符串文字(「dom」)被傳遞時,函數調用是如何工作的?當數組變量(dom)被傳遞時它不起作用?

爲了使變量的工作應該以特定的方式進行類型化?或者還有其他方法嗎?

回答

3

複合文字的存在是令人分心和錯誤的原因是與另一char[]陣列初始化char[]嘗試。以下是非法的:

char dom[50] = "test"; 
char dom1[50] = dom; /* Line 16, the cause of the error. */ 

和鐺報告以下錯誤:

An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

所以:在第6.7.8初始化C99標準狀態

main.c:16:10: error: array initializer must be an initializer list or string literal

14點允許使用字符串字面值"dom"的調用,因爲用字符串文字初始化數組是合法的,但調用char[]是不允許的。

可能的解決方案:

  • 變化的buf類型是一個const char*
  • 包裹在一個structbuf構件這將使它能夠被複制。例如:

    struct char_array 
    { 
        char data[50]; 
    }; 
    
    typedef struct hs_ims_msrp_authority 
    { 
        int  host_type; 
        struct char_array buf; 
        int  port; 
    } hs_i; 
    
    struct char_array dom = { "ine" }; 
    int i = 10, j = 20; 
    
    fun((hs_i){i, dom, j}); 
    fun((hs_i){i, { "dom" }, j}); 
         /* Note^ ^*/ 
    
1

在這種情況下,

fun((hs_i){i, dom, j}); 

你只是過客的字符串指針。 換句話說,你只是路過的

&"ine"[0]

+0

@Sibrajas:這樣做'的樂趣((hs_i){我,* DOM,J})'只會第一性格特徵複製DOM,而不是整個字符串。 – rik

+0

@prasunbheri我還沒有給出答案(fun((hs_i){i,* dom,j})作爲答案,我剛纔解釋了爲什麼好玩((hs_i){i,dom,j});不會工作。 –

0

首先,您需要轉發聲明你的函數:

fun(hs_i c) 

其次,你需要爲你的結構創建存儲,所以你將需要某種臨時變量。

hs_i temp = { i, NULL, j }; 
strcpy(temp.buf, "ine") 
fun(temp); 

或作爲單獨的變量傳遞到您的功能:

fun(int host_type, char *buf, int port); 

.... 
fun(10, "ine", 20); 

..... 

int fun(int host_type, char *buf, int port) 
{ 
printf("%d %s %d\n", host_type, buf, port); 
}