Array von Strings initialisieren

Lesezeit: 3 Minuten

Benutzeravatar von Lior Avramov
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 };

  • 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 auf charnichts 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

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 = NULLoder 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


1393920cookie-checkArray von Strings initialisieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy