简体   繁体   English

C - 尝试写入结构指针时不断出现分段错误

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

I am currently trying to solve a simple hackerrank problem but in a complex way.我目前正在尝试以复杂的方式解决一个简单的hackerrank问题。 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.但是,当我尝试写入 function inputNumbers 中的结构时,一旦遇到 scanf 语句,它就会返回分段错误。 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));
}

Problems:问题:

  • You pass inputNumbers() a uninitialized struct pointer in main() .您在main()中传递inputNumbers()一个未初始化的结构指针。
  • In inputNumbers() the arguments to scanf() require pointers to the variables but you just pass them as they are.inputNumbers()中,arguments 到scanf()需要指向变量的指针,但您只需按原样传递它们。
  • In outputNumbers() you attempt to print the members of numberStruct which are uninitialized.outputNumbers()中,您尝试打印未初始化的numberStruct成员。

Solution:解决方案:

  • Allocate memory for numberStruct_p to point to:为 numberStruct_p 分配numberStruct_p以指向:
numberStruct_p = malloc(sizeof(struct numberStructure));

if (numberStruct_p == NULL) {
     // malloc() failed
}
  • Pass scanf() pointers to the arguments:scanf()指针传递给 arguments:
scanf("%d %d", &numberStruct_p->intOne, &numberStruct_p->intTwo); 
scanf("%f %f", &numberStruct_p->floatOne, &numberStruct_p->floatTwo);

Improved version:改良版:

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

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

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

int main(void) 
{ 
    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)); 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM