Was ist der richtige Weg zum Initialisieren char**
? Ich erhalte Coverity-Fehler – Uninitialized pointer read (UNINIT) beim Versuch:
char **values = NULL;
oder
char **values = { NULL };
Lior Awramow
Was ist der richtige Weg zum Initialisieren char**
? Ich erhalte Coverity-Fehler – Uninitialized pointer read (UNINIT) beim Versuch:
char **values = NULL;
oder
char **values = { NULL };
Dieses Beispielprogramm veranschaulicht die Initialisierung eines Arrays von C-Strings.
#include <stdio.h>
const char * array[] = {
"First entry",
"Second entry",
"Third entry",
};
#define n_array (sizeof (array) / sizeof (const char *))
int main ()
{
int i;
for (i = 0; i < n_array; i++) {
printf ("%d: %s\n", i, array[i]);
}
return 0;
}
Es druckt Folgendes aus:
0: First entry
1: Second entry
2: Third entry
Hallo, es funktioniert! Aber ich habe eine Frage, warum muss ich hier #define n_array verwenden? Ich habe es versucht mit: int n_array, und meine App stürzt ab, ich bin neu in C und verstehe dieses Verhalten nicht – #define statt einfacher Variable int. Vielen Dank.
– andymcgregor
25. November 2017 um 9:38 Uhr
@teMkaa Verwenden #define
ist nur eine Frage des Stils; ich persönlich hätte es nicht gemacht. Innerhalb der main
Funktion könnten Sie einfach eine andere int-Variable definieren und ihr zuweisen sizeof (array) / sizeof (const char *)
.
– Duncan Jones
20. April 2018 um 7:20 Uhr
Es ist in Ordnung, es einfach zu tun char **strings;
, char **strings = NULL
oder char **strings = {NULL}
aber um es zu initialisieren, müssten Sie malloc verwenden:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
// allocate space for 5 pointers to strings
char **strings = (char**)malloc(5*sizeof(char*));
int i = 0;
//allocate space for each string
// here allocate 50 bytes, which is more than enough for the strings
for(i = 0; i < 5; i++){
printf("%d\n", i);
strings[i] = (char*)malloc(50*sizeof(char));
}
//assign them all something
sprintf(strings[0], "bird goes tweet");
sprintf(strings[1], "mouse goes squeak");
sprintf(strings[2], "cow goes moo");
sprintf(strings[3], "frog goes croak");
sprintf(strings[4], "what does the fox say?");
// Print it out
for(i = 0; i < 5; i++){
printf("Line #%d(length: %lu): %s\n", i, strlen(strings[i]),strings[i]);
}
//Free each string
for(i = 0; i < 5; i++){
free(strings[i]);
}
//finally release the first string
free(strings);
return 0;
}
(Ich würde erwarten, dass einige C-Grammatik-Nazzi die Typumwandlung vor Malloc kommentieren.)
– VX
9. Januar 2014 um 15:28 Uhr
Ich denke, es ist nur eine Gewohnheit, C++ zu schreiben und das tun zu müssen
– Nick Beeuwsaert
9. Januar 2014 um 15:49 Uhr
Ich danke dir sehr. Es hilft mir sehr.
– ToanVnET
26. Mai 2020 um 9:19 Uhr
Es gibt keinen richtigen Weg, aber Sie können ein Array von Literalen initialisieren:
char **values = (char *[]){"a", "b", "c"};
oder Sie können jedes zuweisen und initialisieren:
char **values = malloc(sizeof(char*) * s);
for(...)
{
values[i] = malloc(sizeof(char) * l);
//or
values[i] = "hello";
}
verwenden malloc()
ist der Weg zu gehen
– Brian Tracy
9. Januar 2014 um 15:13 Uhr
Ich erhalte einen Compiler-Fehler taking address of temporary array
beim Versuch zu kompilieren char **values = (char *[]){"a", "b", "c"};
… char *values[] = {"a", "b", "c"};
funktioniert aber
– Sebastian
3. Juli 2020 um 13:57 Uhr
Das ist in Ordnung, wenn Sie sie so initialisieren, dass sie überhaupt keine Zeichenfolgen sind. Sie müssen sie trotzdem auf einen gültigen Ort verweisen, bevor Sie sie verwenden (mit malloc oder ähnlichem).
– Tabulator
9. Januar 2014 um 15:02 Uhr
Linux r-mgtswh-130 2.6.18-348.el5 #1 SMP Di 8. Jan 17:53:53 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
– Lior Avramov
9. Januar 2014 um 15:03 Uhr
Dies wird mit gcc kompiliert. Wollen Sie damit sagen, dass dies nicht für Sie kompiliert wird oder dass Sie beim Ausführen Ihres Programms einen Fehler erhalten?
– Kieler
9. Januar 2014 um 15:14 Uhr
char ** values
ist ein Zeiger auf einen Zeiger aufchar
nichts mehr.values
ist kein Array von “Strings”.– alk
9. Januar 2014 um 15:46 Uhr
Gibt es ein Problem zu tun
char *values[] =
um das Array auf dem Stapel zuzuweisen?– VX
9. Januar 2014 um 16:14 Uhr