Ошибка сегментации при использовании scanf с 3 входными переменными - PullRequest
1 голос
/ 04 апреля 2011

Не уверен, почему я получаю ошибку сегментации здесь:

//I define the variables used for input

int *numberOfDonuts;
    numberOfDonuts = (int *)malloc(sizeof(int));

char *charInput;
    charInput = (char *)malloc(sizeof(char));   

int *numberOfMilkshakes;
    numberOfMilkshakes = (int *)malloc(sizeof(int));

//Then attempt to read input
scanf("%c %d %d", &*charInput, &*numberOfDonuts, &*numberOfMilkshakes);

Затем я получаю ошибку сегментации в этой строке.Не могу понять, что я делаю не так?

Ответы [ 3 ]

6 голосов
/ 04 апреля 2011

Вы слишком усложняете то, как вы распределяете переменные.Это должно делать то, что вы хотите:

int numberOfDonuts;
char charInput;
int numberOfMilkshakes;

scanf("%c %d %d", &charInput, &numberOfDonuts, &numberOfMilkshakes);

С базовыми типами, такими как int и char, вам не нужно явно выделять память для них.Компилятор обрабатывает это для вас.

Даже распределяя их так, как вы это сделали, вы получите указатель на значение, а не само значение.Учитывая, что scanf хочет набор указателей, нет необходимости разыменовывать указатель, а затем снова получать его адрес, что вы и пытаетесь сделать.Также будет работать следующее:

int *numberOfDonuts;
    numberOfDonuts = malloc(sizeof(int));

char *charInput;
    charInput = malloc(sizeof(char));   

int *numberOfMilkshakes;
    numberOfMilkshakes = malloc(sizeof(int));

scanf("%c %d %d", charInput, numberOfDonuts, numberOfMilkshakes);
2 голосов
/ 04 апреля 2011

Насколько я могу судить, этот код действителен.

Он компилируется в моей системе и работает как положено.

Это вся ваша программа?

Вы также должны заметить, что все эти указатели не обязательны.

Вы могли бы просто написать это так:

int numberOfDonuts;
char charInput;
int numberOfMilkshakes;

//Then attempt to read input
scanf("%c %d %d", &charInput, &numberOfDonuts, &numberOfMilkshakes);

printf("char=%c donuts=%d milkshakes=%d\n",
        charInput, numberOfDonuts, numberOfMilkshakes);
0 голосов
/ 04 апреля 2011

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

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

Например:

int *numberOfDonuts = (int *)malloc(sizeof(int));
if(numberOfDonuts == NULL)
{
  printf("Memory allocation Failure\n");
  return;
}
...