C Программа: Пример массива - PullRequest
0 голосов
/ 29 мая 2020

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

#include<stdio.h>

main()
{
   char s[10];
   s[10]="pen";
   printf("%s\n",s[10]);    
}

вывод: NULL

Ответы [ 4 ]

2 голосов
/ 29 мая 2020

Это инициализация: char s[10] = "pen";
Это присвоение (и недопустимый синтаксис): s[10]="pen";

Подобный синтаксис, но другие термины. Инициализация выполняется вместе с объявлением переменной. Как правило, инициализацию можно выполнить до запуска программы. Если бы вы, например, написали const char s[10] = "pen";, тогда строка могла бы быть предварительно загружена в переменную перед запуском программы.

Поскольку s[10]="pen"; недействителен C, но ваш компилятор пропустил это с предупреждением ( который вы, вероятно, не читали), рассмотрите возможность компиляции с более строгими настройками компилятора. В g cc это означает компиляцию с -pedantic-errors -Werror, что я настоятельно рекомендую использовать новичкам.

2 голосов
/ 29 мая 2020

Строго говоря, этот оператор

s[10]="pen";

не является инициализацией. Это задание. Вы пытаетесь присвоить строковый литерал "pen", имеющий тип char *, несуществующему элементу типа char массива s с индексом 10.

Итак, оба этих оператора

s[10]="pen";
printf("%s\n",s[10]);

вызывают неопределенное поведение.

Обратите внимание на то, что массивы не имеют оператора присваивания. Массивы - это неизменяемые lvalue. Если вы напишете, например,

s = "pen";

, компилятор выдаст ошибку.

Вам понадобится следующее

char s[10] = "pen";
printf("%s\n",s); 

То есть в данном случае массив s будет инициализировано элементами строкового литерала. Все элементы, у которых нет соответствующего инициализатора строкового литерала, будут инициализированы нулем.

Если вместо инициализации использовать присваивания, то это объявление

char s[10] = "pen";

эквивалентно

char s[10];
s[0] = 'p';
s[1] = 'e';
s[2] = 'n';
s[3] = '\0';
s[4] = '\0';
s[5] = '\0';
s[6] = '\0';`
s[7] = '\0';
s[8] = '\0';
s[9] = '\0';

`

1 голос
/ 29 мая 2020

После объявления массива он больше не является «инициализацией».

Вы пытаетесь присваивать .
Но вы не можете назначить весь массив с использованием синтаксиса: s[10]="pen";

main()
{
   char s[10] = "pen";    // Initialization
   printf("%s\n",s);    
}
0 голосов
/ 29 мая 2020

Вот решение вашей проблемы

#include<stdio.h>

main()
{
   char s[10] = "pen";
   printf("%s\n",s);    
}

И вы не можете получить доступ к s[10], поскольку индексирование начинается с 0 т.е. s[0] - s[9] Причина вывода NULL len(s) равно 3

...