Я получаю доступ к неправильному (за пределами) индексу массива символов в c

Предположим, у нас есть массив символов в c, например,

char a[20];

Можем ли мы получить доступ к индексу 20, чтобы поставить завершающий NULL вот так.

a[20]='\0';

Но в моем алгоритме. («который является преобразователем целочисленного массива символов»), необходимо поставить завершающий NULL, если последний индекс меньше, чем размер массива символов, например,

Если размер моего int равен 4 ("1421"), тогда я должен поставить "1" в индексе 0, "4" в индексе 1, "2" в индексе 2 и "1" в индексе 3.

И, наконец, завершение NULL в индексе 4

index=4;
a[index]='\0';

Другой способ исправить тот же код,

if(index<20)  (Will increase one condition)
    a[index]='\0';

Но я просто хочу знать, возможно ли..... поставить завершающий NULL в индексе 20.

ОК, Я ПОНЯЛ ЭТО ВСЕМ БОЛЬШОЕ СПАСИБО ЗА ВАШУ ПОМОЩЬ.


person Ankesh Kushwah    schedule 24.02.2013    source источник
comment
У вас нет индекса 20... ваш массив из 20 элементов достигает только 19!   -  person Ian McMahon    schedule 24.02.2013


Ответы (3)


Массив char a[20] имеет место для 20 символов с индексами от 0 до 19. Запись в a[20] является записью вне массива и будет иметь непредсказуемые последствия. Вы можете использовать не более 20 символов, включая любой завершающий символ NULL. Если вам нужно место для 20 символов плюс завершающий NULL, вам нужно объявить свой массив как char a[21];. Кроме того, объявление a[20] нигде не ставит NULL.

person Ted Hopp    schedule 24.02.2013

char a[20] : 20 означает, что вы можете иметь элементы из 0-19 . и предполагается, что вы будете использовать только до 19. Если вы заполните до 20, вы получите ошибку.

изменить его на:

a[20+1] => a[21] теперь вы можете использовать 20, чтобы поставить \0 . a[20]='\0'

Код для @AnkeshKushwah

int main()
{
char arr[4]="hell";  
printf("%c",arr[4]); // here you will see garabage. 
printf("%c",arr[5]); // here is the terminating character. after 4.
char arr[]="hell";   
printf("%c",arr[4]); // here you will see terminating character.Because hell will take 
                        0-3 and 4 contains \0 
getch();
}
person Arpit    schedule 24.02.2013
comment
Какая? Я имею в виду, я едва могу понять ответ. - person Alexey Frunze; 24.02.2013
comment
@AlexeyFrunze в какой части вам трудно читать. дайте мне знать, я постараюсь прояснить. - person Arpit; 24.02.2013
comment
Сначала ваш ответ был слишком коротким для понимания. Теперь добрая половина его содержится в одной строке, чем нужно прокручивать. Я не знаю, есть ли у вас дисплей 50, и он там выглядит нормально, но у многих людей, вероятно, нет. - person Alexey Frunze; 24.02.2013
comment
Сейчас лучше, но эти a[20] и a[20+1]; неоднозначны. Это выражения или части объявлений? - person Alexey Frunze; 24.02.2013
comment
Тогда ты должен был так сказать. Полузагадочные ответы трудно понять, особенно если вы новичок в этой области. - person Alexey Frunze; 24.02.2013
comment
да вы правы :). я буду помнить это semi cryptic слово, отвечая на вопросы. ;) - person Arpit; 24.02.2013
comment
@Arpit 20 не будет использоваться для «\ 0», он будет содержать любой символ мусора, у меня была такая же путаница. Спасибо VM за ваши усилия и помощь ...... я получил это. - person Ankesh Kushwah; 24.02.2013
comment
Потому что вы поместили строку в массив char, а именно: ›››› Я говорил об этом char arr[20]; cout‹‹arr[20]; вы не получите завершающий нуль›››››› - person Ankesh Kushwah; 24.02.2013

Рассмотрите возможность инициализации массива символов всеми нулями: char a[20] = { 0 };

Таким образом, независимо от того, сколько символов вы пишете (до 19), вы всегда завершаетесь нулем.

person Ian McMahon    schedule 24.02.2013
comment
char a[20] = { 0 }; инициализирует массив всеми нулями, что совпадает со всеми ограничителями null. Вам не нужно явно писать цикл. - person Ian McMahon; 24.02.2013