Zeiger und Referenzen in C

// Hallo zusammen!
// U.a. Bezugnahmend auf die Inhalte aus meiner Frage zu „Problem bei return mit Char-Array“.

#include 
#include 
#include 
#include 
#include 

#define compress\_char " "

int strleft(char &\*outstring, char \*instring, int count);

int main(int argc, char \*argv[]){

 // if(argc strlen(instring)) return -1;

 outstring = realloc(outstring, count \* sizeof(char));
 if(\*outstring == NULL) return -1;

 strncpy(outstring, instring, count);
 outstring[count] = 0;

 return 0;

}

/\* Meine Frage lautet nun warum das mit der Übergabe der
 Speicheradresse wie von Nicos vorgeschlagen nicht klappt.
 An dieser Stelle auch noch Mal von mir vielen Dank an Nicos
 und Achim für ihre Geduld, Hilfe und Lösungen!

 Grüße
 C. Penkwitt



 Compiler-Ausgabe:
 Compiling...
 main.cpp
 main.cpp(11) : error C2528: 'outstring' : pointer to reference is illegal
 main.cpp(36) : error C2440: 'initializing' : cannot convert from 'char (\*\_\_w64 )[12]' to 'int'
 This conversion requires a reinterpret\_cast, a C-style cast or function-style cast
 main.cpp(37) : error C2100: illegal indirection
 main.cpp(46) : error C2664: 'strleft' : cannot convert parameter 1 from 'char \*' to 'char \*\* '
 Types pointed to are unrelated; conversion requires reinterpret\_cast, C-style cast or function-style cast
 main.cpp(69) : error C2528: 'outstring' : pointer to reference is illegal
 main.cpp(71) : warning C4018: '\>' : signed/unsigned mismatch
 main.cpp(73) : error C2440: '=' : cannot convert from 'void \*' to 'char \*\* '
 Conversion from 'void\*' to pointer to non-'void' requires an explicit cast
 main.cpp(76) : error C2664: 'strncpy' : cannot convert parameter 1 from 'char \*\* ' to 'char \*'
 Types pointed to are unrelated; conversion requires reinterpret\_cast, C-style cast or function-style cast
\*/

Hallo Christan,

Du hast mich zwar nicht explizit in
Deiner Wunschnamensliste erwähnt, ich
„traue“ mir aber mal, Dir eine korrigierte
Version Deines Textes zu posten.

Erstmal von vorneherein: referenz auf
pointer ist „bähh“, das macht man nicht :wink:
Auch wenn es geht, siehe unten.

Ich hab mal nur ein paar kleine Änderungen gemacht
und überlase Dir den Spass, herauszufinden, was
diese bewirkten:

#include 
#include 
#include 

 typedef char \* charptr; // für vereinfachung
 int strleft(charptr& outstring, charptr instring, size\_t count); // ref to char\*
 
 int main(int argc, char \*argv[])
{
 charptr instring = "Das ist ein Teststring, der nur relativ kurz ist. "
 "Kann aber die Funktion testen!";
 printf("Input-String: %s\n", instring);

 char pointer\_test[] = "Hallo Welt!";
 unsigned int pointer\_address\_of\_test = (unsigned int)&pointer\_test;
 printf("Ausgabe über Speicheradresse: %p\n", pointer\_address\_of\_test); // %p

 charptr result = (charptr) malloc(1);
 strleft(result, instring, 5); 
 printf("Ausgabe von strleft: %s\n", result);
 free(result);

 return 0;
}

 int strleft(charptr& outstring, charptr instring, size\_t count)
{
 if(count \> strlen(instring)) return -1;

 outstring = (charptr) realloc(outstring, (count+1) \* sizeof(char));
 if(outstring == NULL) return -1; // if outstring !!

 strncpy(outstring, instring, count);
 outstring[count] = 0;

 return 0;
}

Grüße

CMБ

Hallo Christan,

füge doch bitte noch diese Zeile
hinter der benannten Zeile an

_printf("Ausgabe über Speicheradresse: %p\n", pointer\_address\_of\_test); // %p_
printf("Inhalt dieser Speicheradresse: %s\n", pointer\_address\_of\_test); // %s

Ich hatte Dein Posting nur überflogen,
jetzt ist mir klar, was Du wolltest …

Grüße

Hallo Semjon!

Vielen Dank für deine Hilfe! Da hatte ich wohl in meiner Anfrage etwas blöd formuliert, denn eine Wunschnamenliste sollte das nicht sein. Ich wollte nur das jeder weiß worum es geht.
Ich habe deinen Quelltext mit drei Warnings und null Fehlern übersetzen können und er macht auch genau das was er soll.
Bei pointer_test habe ich ja scheinbar nur den Cast nicht gemacht. In strleft hast du in deiner Version die Operatoren des ersten Parameters effektiv „nur“ vertauscht. Aber müsste jetzt nicht die Größe von outstring statt von result vergrößert werden?
Vielen Dank noch Mal an dieser Stelle für deine Lösung!

Grüße
C. Penkwitt

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Christian

In strleft hast du in deiner Version die Operatoren
des ersten Parameters effektiv „nur“ vertauscht. Aber müsste
jetzt nicht die Größe von outstring statt von result
vergrößert werden?

Nein, denn outstring ist nur der formale Parameter
der Funktion und „in Wirklichkeit“ ein „Platzhalter“
(eben „Referenz auf“) für result.

Daher: never ever Referenzen auf Pointer. Das ist
„Obfuscation der Obfuscation“ :wink:

Das löst man imho eingängiger mit Pointer auf Pointer
(selbe Obfuscation nur zweimal), char **outstring
und …(&result, …)

Grüße

CMБ

Hallo Semjon!
Vielen Dank für deine Hilfe! Auch an Stefan und Achim an dieser Stelle noch Mal Danke! Meine Fragen zum Thema Strings unter C sind damit erst einmal geklärt! Ich werde das fertige Programm dann auch auf meiner Homepage veröffentlichen, aber bis die online geht wird es bestimmt Oktober.

Grüße
C. Penkwitt