#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() , я получаю мусор вместо реальных данных. Есть предложения?