различные способы инициализации массива строк в c - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь инициализировать массив строк в c по-разному, и мне трудно понять, как он себя ведет.

Я пытаюсь инициализировать массив и распечатать его, я пыталсятри способа инициализировать массив

char **argv = {"foo","boo"};
char *argv[] = {"foo","boo"};
char ****argv[] = {"foo","boo"};

, а затем распечатать их, используя

    printf("%s",argv[1]);

Я ожидал, что первый и второй будут работать, а третий потерпит неудачу, но первый дает мнеошибка во время выполнения и другой запуск без проблем, почему? и как скомпилировать их

1 Ответ

2 голосов
/ 30 октября 2019

Среди этих объявлений

char **argv = {"foo","boo"};
char *argv[] = {"foo","boo"};
char ****argv[] = {"foo","boo"};

допустимо только второе объявление.

Первое объявление недопустимо, поскольку вы не можете использовать список в фигурных скобках с более чем одним выражением для инициализациискалярный объект. И даже если вы будете использовать только один строковый литерал в фигурных скобках в первом объявлении, тем не менее тип объявленной переменной (char **) и тип инициализатора (char *) различны, и не существует неявного преобразования между типами.

Третье объявление недопустимо, поскольку не существует неявного преобразования между типом char * (типом строковых литералов, используемых в качестве инициализаторов) и типом char ****.

Допустимые объявленияв C символьных массивов с использованием представленного списка инициализаторов может быть

char *argv1[] = {"foo","boo"};  
char argv2[][3] = {"foo","boo"};    
char argv3[][4] = {"foo","boo"};    

Вот демонстрационная программа

#include <stdio.h>

int main(void) 
{
    char *argv1[] = {"foo","boo"};  
    char argv2[][3] = {"foo","boo"};    
    char argv3[][4] = {"foo","boo"};    


    printf( "%s, %s\n", argv1[0], argv1[1] );
    printf( "%3.3s, %3.3s\n", argv2[0], argv1[1] );
    printf( "%s, %s\n", argv3[0], argv3[1] );

    return 0;
}

Его вывод

foo, boo
foo, boo
foo, boo

Чтобы сделатьпервое правильное значение инициализации, которое вы можете написать

char * p[] = {"foo","boo"}
char **argv = p;

Другой способ - использовать составной литерал, например

char **argv= ( char *[] ){"foo","boo"};

Вот еще одна демонстрационная программа

#include <stdio.h>

int main(void) 
{
    char **argv= ( char *[] ){"foo","boo"}; 


    printf( "%s, %s\n", argv[0], argv[1] );

    return 0;
}

Еевывод

foo, boo
...