2017-02-22 11 views
-1
#include <stdio.h> 

int main(void) { 
    int n,i; 
    int str[n]; 

    scanf("%d\n",&n); 
    for(i=0;i<=n;i++) 
    { 
     scanf("%d",&str[i]); 
     printf("%d th %d\n",i,n); 
    } 
    return 0; 
} 

Вход:Почему седьмая переменная 6 в моей программе?

10 

8 9 2 1 4 10 7 6 8 7 

Выход:

0 th 10 

1 th 10 

2 th 10 

3 th 10 

4 th 10 

5 th 10 

6 th 10 

7 th 6 

Почему на выходе 6?

+1

C является обязательным языком программирования, а не декларативным. Это означает, что ваша программа выполняется по строкам. Вы не можете объявить массив, который будет автоматически обновлять свой размер при изменении 'n', вы можете объявить массив с размером, который находится в' n' **, в точке объявления **. – StoryTeller

+0

Вопрос: (i) хорошо написанный, (ii) содержит короткий компилируемый код, (iii) фактический выпуск документов, (iv) ожидаемый вывод документов. И два установленных пользователя предоставили хорошие ответы, что добавляет больше доверия к вопросу. Так почему же downvote? – Bathsheba

+1

@ Батшеба, возможно, потому, что это вопрос, который показывает, что он не получил «базовую концепцию» C, и поэтому это плохой вопрос, и он плохой человек;) –

ответ

2

В коде

int n,i; 
int str[n]; 

вы используете n в то время как она имеет неопределенное значение, неинициализированными. Он вызывает undefined behavior.

Чтобы уточнить, n является автоматической локальной переменной, если явно не указано явно, содержит неопределенное значение.

Решения: Вам нужно определить int str[n];после вы взяли значение от пользователя (и продезинфицировать).

После этого снова возникает проблема, ваша петля запускается отдельно для массива. C использует индексирование массива на основе 0, поэтому для массива размера n действительными индексами будут 0 до n-1. Конструкция петли должна быть

for(i=0; i<n; i++) 
4

Это действительно странный код с неопределенным поведением. Что вы ожидаете от этого:

int n; // No value! 
int str[n]; 

Что делать? Вы получаете массив, длина которого неизвестна, поскольку n не имеет значения в точке объявления str.

Если вы ожидали, что компилятор для «путешествия во времени» назад к str[n] линии волшебно, когда n дается значение по scanf(), то ... это не то, как работает Co, и вы должны действительно читать на языке а немного более. И скомпилируйте с все предупреждения, которые вы можете получить из своей среды.

В качестве дополнительных деталей, даже если это было закреплены так, чтобы n имели значение, forцикла перерасхода массив и дает неопределенное поведение снова.

Для массива размера m, заголовок цикла следует читать

for (size_t i = 0; i < m; ++i) 

Поскольку индексация 0 на основе, вы не индекса в m может, это за пределами массива.

+0

Интересно, что вы можете спроектировать это свойство «путешествия во времени» с помощью актеров в C++. Хороший ответ, кстати. – Bathsheba

0

Значение для строки str [] еще не определено. Вы должны инициализировать это значение перед объявлением строки/массива.

Если вы используете gcc для компиляции, попробуйте включить флаг -Wall в вашей строке компиляции, чтобы поймать ошибки, подобные этому.

Смежные вопросы