2016-11-21 2 views
-2

dies ist das Problem const:c: Typumwandlung Zeiger auf char char Array

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


void test_me(const char test_array[]){ 
     printf("%s\n", test_array); 
     return; 

} 


void main(void){ 
     char *string = "Successfull cast!"; 
     const char test_array [100]; 
     /* 
     * something that fills the const char test_array 
     * with the contend of *string 
     */ 
     test_me(test_array); 

} 

folgende I habe noch versucht:

strcpy(test_array, string); /*gcc: "...discards const qualifier..."*/ 

dann die:

test_array[0] = string; /*gcc: "assignment of read-only location.."*/ 

. ..und einige Sachen, die kaum vernünftig sind ...

Jemand schlägt eine Lösung vor?

EDIT: Der Punkt ist, dass die API eines anderen Moduls eine const char[] als Parameter anfordert, aber ich habe die angeforderten Informationen ausschließlich in Form des Zeigers. Also gibt es keine Möglichkeit, dass ich das test_array mit dem Inhalt von * string deklarieren kann? Ich weiß, const ist schreibgeschützt, aber irgendwann muss ein const deklariert werden?

+1

Remove const in decleration – Fredrik

+0

@Fredrik: Was ist das Problem ein Stringliteral mit? – Olaf

Antwort

1

Die Lösung ist das const Schlüsselwort in der Erklärung zu überspringen. Wenn du darauf schreiben willst, ist es eindeutig nicht konstant.

char test_array[100]; 

Beachten Sie, dass eine nicht-const-Array an eine Funktion kann die eine const Array wollen, aber nicht umgekehrt.

+0

Ich habe die Frage bearbeitet –

+0

Lesen Sie das letzte Segment meiner Antwort. Es ist vollkommen in Ordnung, ein 'char test_array [100]' an eine Funktion zu übergeben, die ein 'const char test_array []' haben will. –

+0

obwohl eine Problemumgehung Sie mein Problem gelöst haben. Danke Herr. Lindbäck! –

0

const in C bedeutet "schreibgeschützt". Da Sie versuchen, Schreibvorgänge auszuführen, beschwert sich der Compiler zu Recht darüber. Wenn Sie beabsichtigen, in test_array zu schreiben (oder es später zu ändern), dann hat es keinen Sinn, es mit const zu qualifizieren. Also, lassen Sie einfach die const von: const char test_array [100]; fallen.

Im Hinblick auf Sie bearbeiten:

Der Punkt dabei ist, dass die API eines anderen Moduls ein const char anfordert [] als Parameter, aber ich habe die angeforderten Informationen ausschließlich in Form des Zeigers.

Sie können jederzeit eine char* auf eine Funktion, die const char* erwartet - die in C. Die const in Ihrem API erlaubt ist, bedeutet es sagt, dass es nicht um den Inhalt des Zeigers zu ändern, ist die Absicht Sie es passieren. Die Antwort ist immer noch das gleiche: fallen nur die const von const test_array[100];

das Lesen Sie auch: http://c-faq.com/ansi/constmismatch.html

+0

Ich habe die Frage bearbeitet –

+0

@JoschKraus Ihre API-Definition hält Sie nicht davon ab, 'test_array' zu übergeben, ohne es' const' zu machen. Es bedeutet nur, dass Ihre API es nicht ändert. – usr

+0

Danke @usr du hast das für mich gelöst! –

0

Sie können einfach einen Zeiger an eine Funktion übergeben, die ein Array akzeptiert.

Im Kontext einer Funktionsdeklaration wird ein formaler Parameter von Array-Typen als Zeiger behandelt.

z.

void test_me(const char test_array[]) 

als

interpretiert
void test_me(const char *test_array) 

(siehe comp.lang.c FAQ)