2013-01-22 9 views
6

Proszę spojrzeć na ten programkłopoty w przejściu strukturę dosłownego jako parametr funkcji

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

W wywołaniu funkcji zabawy w głównym; jak działa wywołanie funkcji, gdy literał łańcuchowy ("dom") jest przekazywany tam, gdzie jako przekazana zmienna tablicowa (dom) nie działa?

Aby zmienić pracę, należy ją typować w określony sposób? czy jest jakiś inny sposób?

Odpowiedz

3

Obecność związku dosłownym rozprasza i przyczyną błędu jest próba zainicjowania char[] z innym char[] tablicy. Poniżej nielegalne:

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

i brzęk zgłasza następujący błąd:

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

punkt 14 w sekcji 6.7.8 Inicjalizacja standardowych stanach 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.

So wywołanie z literałem literowym "dom" jest dozwolone, ponieważ legalne jest zainicjowanie tablicy z literałem łańcuchowym, ale wywołanie z char[] jest niedozwolone.

Możliwe rozwiązania:

  • zmienić typ buf być const char*
  • owinąć członkowskim w structbuf który pozwoliłby być kopiowane. Na przykład:

    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

W tym przypadku

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

jesteś tylko przejazdem wskaźnik do łańcucha. Innymi słowy, jesteś po prostu przekazując

&"ine"[0]

+0

@Sibrajas: robi to 'zabawy ((hs_i) {i, * dom, j})' by skopiować tylko pierwszy charecter w dom, ale nie cały ciąg. – rik

+0

@prasunbheri Nie podałem tego (zabawna ((hs_i) {i, * dom, j}) jako odpowiedź. Właśnie wyjaśniłem, dlaczego zabawa ((hs_i) {i, dom, j}) nie zadziała. –

0

Przede wszystkim, trzeba do przekazania zadeklarować swoją funkcję:

fun(hs_i c) 

drugie, trzeba stworzyć magazyn dla swojej struktury, więc potrzebujesz jakiejś zmiennej tymczasowej.

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

Albo uchodzić za poszczególne zmienne do funkcji:

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); 
} 
Powiązane problemy