структура не возвращается должным образом из функции на c

#c #ubuntu #input #struct #segmentation-fault

#c #ubuntu #ввод #struct #ошибка сегментации

Вопрос:

У меня есть следующее на lubuntu:

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

struct fields{
  int hostNumber;
  int *numberArray;
};

struct fields *start();
struct fields *gatherData();
void sendMessageToOtherProcesses(struct fields *);

int main(int argc, char** argv) {
  struct fields *myFields;
  
  myFields = start();    
  return 0;
}

struct fields *start(){
  int input;
  struct fields *myFields;
  printf("1) Type 1 For Executionn");
  printf("2) Type 2 For Exitn");
  printf("Give your choice:");
  scanf("%d",amp;input);
  switch(input){
    case 1:
        myFields = gatherData();
        break;
    case 2:
    default:
        exit(0);
  }
  return myFields;
}

struct fields *gatherData(){
  int host;
  struct fields *myFields;

    printf("Give the host of the number to be checked if they are ordered:");
    scanf("%d",amp;host);


  int nmbArray[host];

  for (int i = 0; i < host; i  ){
    printf("Give the %d number:", i);
    scanf("%d", amp;nmbArray[i]);
   // printf("array=%dn", nmbArray[i]); 
  }  

  myFields->hostNumber = host; 
  myFields->numberArray = amp;nmbArray[0];
  for (int i = 0; i < (myFields->hostNumber) ; i  ){
    printf("array=%dn", (*(myFields->numberArray)));
    (myFields->numberArray)  ;
  }    

  return myFields;

}
  

И я принимаю ошибку сегментации. Любое предложение. Также взгляните на цикл for , я не могу брать числа из массива, сохраненного через ввод. В Windows отлично работает на mingw64, но теперь я нахожусь на 32-битной машине lubuntu 18.10.

Заранее спасибо!!!

Ответ №1:

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

   myFields = malloc(sizeof(*myFields)); /* add this to allocate memory */
  myFields->hostNumber = host; 
  myFields->numberArray = amp;nmbArray[0];
  

Проверка успешности malloc() сделает ваш код лучше:

   myFields = malloc(sizeof(*myFields));
  if (myFields == NULL) return NULL; /* add this to check if malloc() is successful */
  myFields->hostNumber = host; 
  myFields->numberArray = amp;nmbArray[0];
  

Другой момент заключается в том, что массив

   int nmbArray[host];
  

будет удален при возврате из функции, и указатели на это станут бесполезными после этого.

Вместо этого выделите это динамически:

   int* nmbArray = malloc(sizeof(*mnbArray) * host);
  

Затем, после цикла, myFields->numberArray изменяется, чтобы указывать на элемент, следующий за последним элементом nmbArray , поэтому установите его снова nmbArray после цикла.
Это можно сделать, выполнив

   myFields->numberArray = amp;nmbArray[0];
  

снова.

Комментарии:

1. Да, вы были правы, но если я хочу повторить myFields в start() , я получаю мусор вместо реальных данных. Есть предложения?