簡體   English   中英

運行時C程序中的分段錯誤

[英]Segmentation Error in C program When Run

我已經嘗試了malloc ,沒有malloc ,它將構建但不運行或編譯。 當我在codepad.org上運行代碼時,它給了我一個分段錯誤。 我有一系列我正在輸入的結構,我正在搜索它們以查找特定項目。 這是我得到的,沒有編譯。 代碼如下(我使用netbeans,codeblocks和visual basic 2012程序):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 20
#define BLOODTYPESIZE 4
#define MAX 120000

typedef struct {
    int month;
    int day;
    int year;
} dateT;

typedef struct {
    int hour;
    int minute;
} timeT;

typedef struct {
    char name[SIZE];
    char organname[SIZE];
    char bloodtype[BLOODTYPESIZE];
    dateT dateAdded;
    timeT timeAdded;
    int received;
} organT;

int main(void) {
    int i, n, k, j;
    int c;
    int *ptr;

    char organ[SIZE];
    char bloodkind[BLOODTYPESIZE];

    organT patient[MAX];

    scanf("%d",&n);
    ptr = (int *)malloc(n * sizeof(*ptr));
    printf("Enter patient information\n");
    for(i=1; i<=n; i++){
        scanf("%s", patient[i].name[SIZE]);
        scanf("%s", patient[i].organname[SIZE]);
        scanf("%s", patient[i].bloodtype[BLOODTYPESIZE]);
        scanf("%d %d %d", patient[i].dateAdded);
        scanf("%d %d", patient[i].timeAdded);
        patient[i].received = 0;
}
scanf("%d", &k);
for(j=0; j<k; j++) {
    gets(organ);
    printf("Organ received: %s", organ);
    gets(bloodkind);
    printf("Organ has blood type: %s", bloodkind);
}
for (c=0; c<n; c++){
    if(patient[i].organname == organ){
        if(patient[i].bloodtype == bloodkind){
            if(patient[i].received == 0) {
                printf("Patient(s) Found!\n");
                printf("%s", patient[i].name[SIZE]);
                printf("Organ received: %s", organ);
                patient[i].received = 1;
            }
            if(patient[i].received == 1)
                printf("Patient already received organ\n");
        }
        else("Not correct blood type\n");
    }
    else("No match found\n");
}

return (EXIT_SUCCESS);
}

看起來你沒有正確使用地址。 例如,當你說

scanf("%s", &patient[i].name[SIZE]);

你實際上正在閱讀patient[i].name的分配空間。 您應該將語句更改為

scanf("%s",patient[i].name);

並類似地修復其他聲明。

  • 首先檢查n與MAX比較
  • 在這里你可以訪問bloodtype[BLOODTYPESIZE]但是這個標簽中的最后一項是bloodtype[BLOODTYPESIZE-1]

      scanf("%s", &patient[i].bloodtype[BLOODTYPESIZE]); 

對於段落中的其他訪問,同樣的問題也是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM