C - Keep getting Segmentation Fault when trying to write to Struct Pointer

Viewed 66

I am currently trying to solve a simple hackerrank problem but in a complex way. I'm attempting to keep all values in a structure. But when I try to write to the structure in the function inputNumbers, as soon as the scanf statement is hit, it returns a segmentation fault. I can't figure out what i'm doing wrong. Any ideas?

#include <stdio.h>

struct numberStructure {
    int intOne;
    int intTwo;
    float floatOne;
    float floatTwo;
} numberStruct, *numberStruct_p;

void inputNumbers(struct numberStructure *);
void outputNumbers(void);

int main(void) {
    
    inputNumbers(numberStruct_p);
    outputNumbers();
    return(0);
}

void inputNumbers(struct numberStructure *numberStruct_p) {
    printf("\n-----WELCOME TO THE PROGRAM-----\n");
    printf("-----ENTER IN TWO INTEGERS (Space separated)-----\n: ");
    scanf("%d %d", numberStruct_p->intOne, numberStruct_p->intTwo);
    printf("-----ENTER IN TWO FLOATS (Space separated)-----\n: ");
    scanf("%f %f", numberStruct_p->floatOne, numberStruct_p->floatTwo);
}

void outputNumbers(void) {
    printf("\n%d %d", (numberStruct.intOne + numberStruct.intTwo), (numberStruct.intOne - numberStruct.intTwo));
    printf("\n%.1f %.1f", (numberStruct.floatOne + numberStruct.floatTwo), (numberStruct.floatOne - numberStruct.floatTwo));
}
1 Answers

Problems:

  • You pass inputNumbers() a uninitialized struct pointer in main().
  • In inputNumbers() the arguments to scanf() require pointers to the variables but you just pass them as they are.
  • In outputNumbers() you attempt to print the members of numberStruct which are uninitialized.

Improved version:

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

struct numberStructure { 
       int intOne;
       int intTwo;
       float floatOne;
       float floatTwo;
}; 

void inputNumbers(struct numberStructure *s);
void outputNumbers(struct numberStructure *s);

int main(void) 
{ 
    struct numberStructure *numberStruct_p = malloc(sizeof(struct numberStructure));

    if (numberStruct_p == NULL)
        return -1;
    
    inputNumbers(numberStruct_p);
    outputNumbers(numberStruct_p);

    free(numberStruct_p);

    return 0; 
} 

void inputNumbers(struct numberStructure *s) 
{ 
     printf("\n-----WELCOME TO THE PROGRAM-----\n");
     printf("-----ENTER IN TWO INTEGERS (Space separated)-----\n: ");
     scanf("%d %d", &s->intOne, &s->intTwo);
     printf("-----ENTER IN TWO FLOATS (Space separated)-----\n: "); 
     scanf("%f %f", &s->floatOne, &s->floatTwo);
}

void outputNumbers(struct numberStructure *s)
{ 
     printf("\n%d %d", (s->intOne + s->intTwo), (s->intOne - s->intTwo)); 
     printf("\n%.1f %.1f", (s->floatOne + s->floatTwo), (s->floatOne - s->9floatTwo)); 
}
Related