Почему он показывает два массива, а не один массив - PullRequest
3 голосов
/ 25 апреля 2019

Я новичок в. Сегодня, когда я пишу программу на c, я нахожу странную вещь То, что я хочу показать, это abc, но оно показывает abcefg. Я хочу знать, почему это так показано. код:

#include <stdio.h>
int main() {
  char a[3] = "abc";
  char b[3] = "efg";
  printf("%s", a);
  return 0;
}

Это ответ не abc, а abcefg

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Строки в C заканчиваются нулями на '\0'."abc" на самом деле { 'a', 'b', 'c', '\0' }, что составляет 4 char с.В вашем массиве a есть место только для 3 char с, поэтому '\0' не сохраняется.Когда printf() пытается распечатать строку, хранящуюся в a, он читает и печатает один символ за раз, пока не встретит завершающий '\0', но его нет.Так что он продолжает читать и печатать.И бывает, что b находится прямо рядом с a в памяти, поэтому содержимое b также получает отпечаток.

Cure:

#include <stdio.h>

int main(void)
{
    char a[4] = "abc";
    char b[4] = "efg";
    printf("%s", a);
}

или, что еще лучше, не указывайте размер для массивов вообще.Пусть компилятор определит правильный размер на основе инициализатора "abc":

#include <stdio.h>

int main(void)
{
    char a[] = "abc";
    char b[] = "efg";
    printf("%s", a);
}
2 голосов
/ 25 апреля 2019

char a[3] = "abc"; не хватает места для 0-терминатора, поэтому printf будет считывать за пределами (неопределенное поведение) в следующую ячейку памяти, где он находит массив b (по счастливой случайности).

Вы должны использовать char a[4] = "abc"; или char a[] = "abc";.

Если вы не пишете размер массива, компилятор оценит минимальный размер после инициализации.

char b[3] = "efg"; имеетта же проблема, но, кажется, вам повезло, что у вас есть 0 байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...