2013-01-22 15 views
6

Si prega di dare un'occhiata a questo programmadifficoltà nel passare struttura letterale come parametro di funzione

#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); 
} 

In chiamata alla funzione di divertimento in principale; come mai funziona la funzione call quando viene passato string letterale ("dom") dove, come quando viene passata la variabile array (dom), non funziona?

Per rendere il lavoro variabile dovrebbe essere tipizzato in modo specifico? o c'è qualche altro modo?

risposta

3

La presenza del composto letterale distrae e la causa dell'errore è il tentativo di inizializzare un char[] con un'altra char[] array. Quello che segue è illegale:

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

e clang segnala il seguente errore:

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

Punto 14 nella sezione 6.7.8 inizializzazione degli stati standard C99:

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.

Così la chiamata con la stringa letterale "dom" è consentita in quanto è legale inizializzare una matrice con una stringa letterale, ma la chiamata con lo char[] non è permesso.

Possibili soluzioni:

  • cambiare il tipo di buf di essere un const char*
  • avvolgere il membro buf in una struct, che gli consenta di essere copiato. Per esempio:

    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

In questo caso,

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

siete solo di passaggio del puntatore alla stringa. In altre parole, siete solo di passaggio la

&"ine"[0]

+0

@Sibrajas: facendo questo 'divertente ((hs_i) {i, * Dom, j})' sarebbe solo copiare la prima charecter in dom, ma non l'intera stringa. – rik

+0

@prasunbheri Non ho dato questo (divertente ((hs_i) {i, * dom, j}) come risposta.Ho appena spiegato perché fun ((hs_i) {i, dom, j}); non funzionerà. –

0

Prima di tutto, è necessario inoltrare dichiarare la vostra funzione:

fun(hs_i c) 

In secondo luogo, è necessario creare l'archiviazione per la vostra struct, quindi avrai bisogno di una variabile temporanea di qualche tipo.

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

O passare variabili come singoli alla funzione:

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); 
} 
Problemi correlati