Использование переменных, установленных во время выполнения, для указания размера массива символов
Я пытался использовать набор переменных во время выполнения, чтобы указать размер массива символов,
#include<stdio.h>
int main(void)
{
int n;
printf("ENTER THE NUMBER OF Characters IN THE STRING:\n");
scanf("%d",&n);
char string[n];
printf("Enter the string:\n");
scanf("%s",string);
printf("\nTHE STRING IS:\n");
printf("%s\n",string);
return 0;
}
Я не могу понять следующий вывод,
ENTER THE NUMBER OF Characters IN THE STRING:
2
Enter the string:
abcdefghijk
THE STRING IS:
abcdefghijk
Даже после указания количества символов в строке как 2, почему отображается вся введенная строка?
3 ответа
Доступ к индексу массива вне привязки вызвал неопределенное поведение.
Стандарт C11:
J.2 Неопределенное поведение
Индекс массива находится вне диапазона, даже если объект явно доступен с данным индексом (как в выражении lvalue)
a[1][7]
учитывая объявление inta[4][5]
) (6.5.6).Сложение или вычитание указателя на объект массива или сразу за ним и целочисленный тип приводит к результату, который указывает непосредственно за объектом массива и используется в качестве операнда оцениваемого унарного оператора * (6.5.6).
Когда вы обращаетесь к индексу, выходящему за рамки массива, вы получите неопределенное поведение из-за ArrayIndexOutOfBound
,
В C не проверка границ позволяет программе на C работать быстрее.
Вы можете предпочесть
Динамическое распределение памяти
Если вы обращаетесь к элементам массива вне границ, это вызывает неопределенное поведение. Как C
не проверяет граничное условие массива, компилятор не выдает ошибку, но вызывает неопределенное поведение.
Даже после указания количества символов в строке как 2, почему отображается вся введенная строка? Задача программиста - обеспечить достаточно места в памяти для хранения данных во время выполнения и соответственно обрабатывать такие вещи.