Использование переменных, установленных во время выполнения, для указания размера массива символов

Я пытался использовать набор переменных во время выполнения, чтобы указать размер массива символов,

#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] учитывая объявление int a[4][5]) (6.5.6).

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

Когда вы обращаетесь к индексу, выходящему за рамки массива, вы получите неопределенное поведение из-за ArrayIndexOutOfBound,

В C не проверка границ позволяет программе на C работать быстрее.

Вы можете предпочесть

Динамическое распределение памяти

Если вы обращаетесь к элементам массива вне границ, это вызывает неопределенное поведение. Как C не проверяет граничное условие массива, компилятор не выдает ошибку, но вызывает неопределенное поведение.

Даже после указания количества символов в строке как 2, почему отображается вся введенная строка? Задача программиста - обеспечить достаточно места в памяти для хранения данных во время выполнения и соответственно обрабатывать такие вещи.

Другие вопросы по тегам