само значение переменной изменяется, когда оно задано в цикле for - PullRequest
0 голосов
/ 24 февраля 2020

когда я отсканировал 't', значение равно 1, но к концу l oop его значение изменяется на 2 без увеличения

#include <stdio.h>

int main()
{
int i,t,n,a[]={},b[]={},k=0,p;
printf("enter the number ");
scanf("%d",&t);
for(p=0;p<t;p++)
{


    scanf("%d",&n);
    for(i=0;i<n-1;i++)
    {
        scanf("%d",&a[i]);
    }

    for(i=0;i<n-2;i++)
    {
       // printf("\nhello");
        if((a[i+1]-a[i])!=1)
        b[k]=a[i];
        k++;
    }
    printf("\n%d",t);
}
return 0;
}

вывод: введите число 1
4
1
2
4

2

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

int a[]={}; недействительно C, подробности здесь . Причина его компиляции в том, что вы используете компилятор g cc в нестандартном режиме.

К сожалению, g cc поставляется таким образом из коробки. Чтобы использовать g cc для компиляции кода в соответствии со спецификацией языка C, вам нужно использовать gcc -std=c11 -pedantic-errors. Где C11 является текущей основной версией стандарта, а -pedantic-errors выдает ошибки компилятора, когда ваш код не следует этому стандарту.

Advanced: причина, по которой g cc допускает {} в нестандартном Режим связан с массивами нулевой длины и предварительно стандартными элементами гибкого массива - старыми нестандартными вещами, которые предшествуют старому стандарту C под названием C99, выпущенному за 20 лет go. Эти старые функции - это не то, что кому-то, а тем более новичку следует пользоваться или заботиться о них.

В расширениях языка GNU C не упоминается, что произойдет, когда вы получите доступ к такому массиву за пределами. Очевидно, он падает так же, как стандартный массив.

Что вы должны сделать вместо этого, если размер массива неизвестен во время компиляции:

  • Всегда компилировать с gcc -std=c11 -pedantic-errors -Wall -Wextra.
  • Возьмите размер массива в качестве ввода.
  • После того, как вы узнаете размер, выделите для него место. Желательно с динамическим c выделением памяти:

    int* array = malloc(n * sizeof(*array)); // where n is the number of items
    ...
    free(array);
    
0 голосов
/ 24 февраля 2020

Массивы a и b не имеют явного размера, а их списки инициализаторов пусты. Это означает, что массивы имеют размер 0, и попытка чтения или записи в эти массивы вызовет неопределенное поведение .

Перемещение определений массива после чтения значения для n, затем используйте n в качестве размера массива.

int i,t,n,k=0,p;
printf("enter the number ");
scanf("%d",&t);
for(p=0;p<t;p++)
{
    scanf("%d",&n);
    int a[n], b[n];
    ...
...