2015-09-22 2 views
0

Программа, над которой я работаю, требует от пользователя ввода целочисленного значения, а затем на основе этого значения печатает массив нулей. Я смог сделать это, когда размер массива задан, однако, когда вы пытаетесь сделать это на входе пользователя, я получаю ошибки компилятора. Я попытался исправить ошибку, но я ничего не понял, так как большинство исправлений используют dynamic memory allocation, которые мы еще не научили использовать. Это код, который я придумал до сих пор.Размер массива на основе пользовательского ввода

В моих попытках выяснить, почему я получаю ошибки, я обнаружил, что если я не инициализирую массив с 0, массив печатается на размер, который вводит пользователь, однако, конечно, номера выходных данных массива абсолютно случайны.

Когда у меня есть размер инициализированного массива, я получаю ошибку variable-sized object may not be initialized с небольшой стрелкой, указывающей на j в квадратных скобках в int j, ar[j]={20};.

Есть ли другой способ, который не использует dynamic memory allocation?

#include <stdio.h> 

int main(void){ 

    int i; 
    int j, ar[j]={0}; 

    printf("Please enter the value:"); 
    scanf("%d",&j); 

    for(i=0; i<j;i++){ 
     printf("%i\n",ar[j]); 
    } 

ответ

0
int j, ar[j]={0}; // you should not do this 

Это не правильно, как j является uninitalized.

Но это будет поддерживаться в C99-

int j; 
printf("Please enter the value:"); 
scanf("%d",&j);   // take input in j 
int ar[j];    // this statement int ar[j]={0} will give compilation error 

for(i=0;i<j;i++){ 
    ar[i]=0;   
    printf("%d",ar[i]); 
} 
+0

Не получаю ли я ту же ошибку, так как я до сих пор не использовал ничего другого, просто переупорядочил его? – sandalwood

+0

@BLUEPIXY Сделал это. Благодаря !! – ameyCU

+0

@sandalwood Это не даст ошибки, я полагаю. Сначала он дал ошибку, потому что 'j' был там неопределенным. – ameyCU

-1

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

Я предлагаю вам использовать malloc или calloc для C. calloc очищает память после выделения.

#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 

    int i; 
    int j, *ar; 

    printf("Please enter the value:"); 
    scanf("%d",&j); 
    ar = calloc(j, sizeof(int)); 
    if (ar == NULL) return 1; 

    for(i=0; i<j;i++){ 
     printf("%i\n",ar[j]); 
    } 

    free(ar); 
    return 0; 
} 

Использование new[] подходит для C++.

#include <stdio.h> 

int main(void){ 

    int i; 
    int j, *ar; 

    printf("Please enter the value:"); 
    scanf("%d",&j); 
    ar = new int[j]; 

    for(i=0; i<j;i++){ 
     printf("%i\n",ar[j]); 
    } 
    delete[] ar; 
    return 0; 
} 
+0

Спасибо за ваш ответ, если вы не возражаете, пожалуйста, вы можете объяснить или связать меня к чему-то, что идет над тем, что происходит здесь: 'ар = calloc (j, sizeof (int)); if (ar == NULL) return 1; ', а также то, что делает' free (ar) '. – sandalwood

+0

'calloc (j, sizeof (int))' выделяет '' '' 'sizeof (int)' и очищает их до нуля. 'if (ar == NULL)' проверяет, удалось ли распределение. – MikeCAT

+0

О, ладно, я вижу, спасибо за вашу помощь. Кажется, что обучение C-кодированию никогда не заканчивается: P. – sandalwood

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