web-dev-qa-db-ja.com

文字列の配列を初期化する

char**を初期化する正しい方法は何ですか?コベリティエラーが発生します-初期化されていないポインターの読み取り(UNINIT)を試みると:

char **values = NULL;

または

char **values = { NULL };
28
Lior Avramov

このサンプルプログラムは、C文字列の配列の初期化を示しています。

#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;
}

以下を出力します。

0: First entry
1: Second entry
2: Third entry
46
Ebrahimi

char **strings;char **strings = NULL、 または char **strings = {NULL}

ただし、初期化するにはmallocを使用する必要があります。

#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;
}
8
Nick Beeuwsaert

正しい方法はありませんが、リテラルの配列を初期化できます。

char **values = (char *[]){"a", "b", "c"};

または、それぞれを割り当てて初期化できます。

char **values = malloc(sizeof(char*) * s);
for(...)
{
    values[i] = malloc(sizeof(char) * l);
    //or
    values[i] = "hello";
}
7
Vladp