Присвоение значений массиву после malloc вызывает сбой

0

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

#include<stdio.h>
#include<stdlib.h>
int main(){
    int *x, *y, n, m, i;

    printf("Enter lenght of arrays x and y (separated by space): ");
    scanf("%d%d", &n, &m); fflush(stdin);

    if (x = (int*)malloc(sizeof(int) * n) == NULL){
        fprintf(stderr, "Error!\n");
        exit(1);
    }
    if (y = (int*)malloc(sizeof(int) * m) == NULL){
        fprintf(stderr, "Error!\n");
        exit(1);
    }

    printf("Enter %d values for X array (separated by space) ", n);
    for (i = 0; i < n; i++)
        scanf("%d", x + i);
    fflush(stdin);

    printf("Enter %d values for Y array (separated by space): ", m);
    for (i = 0; i < m; i++)
        scanf("%d", y + i);
    } //the two for were originally in a function, I tried using the code like this as well
    return 0;
}

Я также попытался запустить scanf ("% d", x [i]); но ничего не работает. Каждый раз, когда я нажимаю Enter после ввода массива для X, программа вылетает из строя. Кстати, изначально нет fflush (stdin), я добавил их, потому что я думал, что вход принял \0 как одно из значений и создал ошибки.

Спасибо за чтение! :)

  • 3
    fflush(stdin); является неопределенным поведением. Также ........
  • 0
    Как это неопределенное поведение (не пытаясь быть грубым, я просто новичок в использовании, поэтому любая информация приветствуется!), Мы использовали ее в колледже, из того, что я получил, «проглатывает» любой вход, зарегистрированный на компьютере, так далеко, поэтому такие функции, как gets (); не принимать входные данные, такие как \ 0. РЕДАКТИРОВАТЬ: и когда я исправил malloc внутри if (добавив скобки), код работал! Спасибо! Если хотите, укажите это в ответах, и я дам вам звездочку / стрелку вверх.
Показать ещё 3 комментария
Теги:
arrays
malloc

3 ответа

2
Лучший ответ

Код имеет кучу неустановленных фигурных скобок и скобок, особенно в операторах if. Перед выполнением сравнения необходимо скопировать задания в скобках, иначе они будут неправильно назначены. Попробуйте это, он собрал и работал для меня:

#include<stdio.h>
#include<stdlib.h>
int main(){
int *x, *y, n, m, i;

printf("Enter lenght of arrays x and y (separated by space): ");
scanf("%d%d", &n, &m);

if ((x = (int*)malloc(sizeof(int) * n)) == NULL){
    fprintf(stderr, "Error!\n");
    exit(1);
}
if ((y = (int*)malloc(sizeof(int) * m)) == NULL){
    fprintf(stderr, "Error!\n");
    exit(1);
}

printf("Enter %d values for X array (separated by space) ", n);
for (i = 0; i < n; i++)
    scanf("%d", x + i);

printf("Enter %d values for Y array (separated by space): ", m);
for (i = 0; i < m; i++)
    scanf("%d", y + i);
 //the two for were originally in a function, I tried using the code like this as well
return 0;
}

И, как все говорят, не используйте fflush (stdin)

2

Использование fflush(stdin), вероятно, вызывает крах, поскольку это неопределенное поведение в стандартном C.

Взгляните на этот ответ, что такое использование fflush (stdin) в c-программировании

  • 0
    Нет, Крис решил это, в операторе if не задал вопрос, не выделил ли malloc память (недостаточно ли скобок). Stdin в целом работал нормально, когда я это исправил.
  • 1
    @NemanjaT: Я до сих пор настоятельно рекомендую вам прекратить использовать fflush(stdin) поскольку это неопределенное поведение, что в основном означает «не гарантированно работает». Это может быть неработоспособность в вашей системе, но, скорее всего, однажды это вызовет у кого-то сильную боль, потому что в его конкретной конфигурации произойдет сбой.
Показать ещё 1 комментарий
0

Я попытался скомпилировать программу с Visual Studio 2013 и получил 2 ошибки в строках с malloc: ошибка C2440: '=': не может преобразовать из 'bool' в 'int *' После того, как я зафиксировал обе строки на

 if ((x = (int*)malloc(sizeof(int) * n)) == NULL){

или

if (x = (int*)malloc(sizeof(int) * n)){

программа работает без проблем.

Я не понимаю, почему вы можете скомпилировать код, но он делает следующее:

compare (int *) malloc (sizeof (int) * n) == Результат NULL является ложным и теперь устанавливает y = false, а y не указывает на выделенный массив.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню