2013-01-22 7 views
6

haben Sie einen Blick auf dieses ProgrammProbleme in der Struktur vorbei wörtlichen als Funktionsparameter

#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 Aufruf Spaß Funktion in main; Wie kommt Funktionsaufruf, wenn String-Literal ("dom") übergeben wird, wo, wie wenn Array-Variable (dom) übergeben wird funktioniert es nicht?

Um variable Arbeit zu machen, sollte es auf eine bestimmte Art typisiert werden? oder gibt es einen anderen Weg?

Antwort

3

Die Gegenwart der Verbindung Literal ist störend und die Ursache für den Fehler ist der Versuch, einen mit einem anderen char[]char[] Array zu initialisieren. Das folgende ist illegal:

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

und Klirren meldet den folgenden Fehler:

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

Punkt 14 im Abschnitt 6.7.8 Initialisierung der C99-Standard ist:

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 Der Aufruf mit dem String-Literal "dom" ist erlaubt, da es zulässig ist, ein Array mit einem String-Literal zu initialisieren, aber der Aufruf mit der char[] ist nicht erlaubt.

Mögliche Lösungen:

  • Änderung der Art der buf ein in einem structconst char*
  • wickeln Sie das buf Mitglied sein, die es ermöglichen würde, kopiert werden. Zum Beispiel:

    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 diesem Fall

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

Sie nur auf den Zeiger auf den String. Mit anderen Worten, sind vorbei Sie nur die

&"ine"[0]

+0

@Sibrajas: tun, diese 'fun ((hs_i) {i, * dom, j})' würde den ersten charecter in dom nur kopieren, aber nicht die gesamte Zeichenfolge. – rik

+0

@prasunbheri Ich habe das nicht gegeben (Spaß ((hs_i) {i, * dom, j}) als Antwort. Ich habe gerade erklärt, warum Spaß ((hs_i) {i, dom, j}); nicht arbeiten. –

0

Zunächst einmal müssen Sie Ihre Funktion weiterleiten erklären:

fun(hs_i c) 

Zweitens müssen Sie den Speicher für Ihre Struktur erstellen, Sie werden also eine temporäre Variable benötigen.

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

oder als einzelne Variablen auf Ihre Funktion übergeben:

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); 
} 
Verwandte Themen