簡體   English   中英

C - 嘗試寫入結構指針時不斷出現分段錯誤

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

我目前正在嘗試以復雜的方式解決一個簡單的hackerrank問題。 我試圖將所有值保留在一個結構中。 但是,當我嘗試寫入 function inputNumbers 中的結構時,一旦遇到 scanf 語句,它就會返回分段錯誤。 我無法弄清楚我做錯了什么。 有任何想法嗎?

#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));
}

問題:

  • 您在main()中傳遞inputNumbers()一個未初始化的結構指針。
  • inputNumbers()中,arguments 到scanf()需要指向變量的指針,但您只需按原樣傳遞它們。
  • outputNumbers()中,您嘗試打印未初始化的numberStruct成員。

解決方案:

  • 為 numberStruct_p 分配numberStruct_p以指向:
numberStruct_p = malloc(sizeof(struct numberStructure));

if (numberStruct_p == NULL) {
     // malloc() failed
}
  • scanf()指針傳遞給 arguments:
scanf("%d %d", &numberStruct_p->intOne, &numberStruct_p->intTwo); 
scanf("%f %f", &numberStruct_p->floatOne, &numberStruct_p->floatTwo);

改良版:

#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