Связь между ошибкой сегментации и структурой - PullRequest
0 голосов
/ 27 октября 2018

Я получаю Segmentation fault, когда пытаюсь scanf чисел в структуре. Я не знаю, если это связь между scanf и ошибкой в ​​этом случае или нет. Я думаю, что я хорошо распределил память, я читал за последние 2 часа об этой ошибке, и везде я читал о проблемах с выделением памяти, но я не вижу этого в своем коде. Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <time.h>

#define MAX_STRING_LEN 80
#define PHONE_NUMBER 15

struct order {
    time_t   systime;
    char     name[MAX_STRING_LEN];
    char     email[MAX_STRING_LEN];
    int      phonenumber;
    int      size;    
};


//functions
void readName(struct order *current);
void checkValues(struct order *current);
void readEmail(struct order *current);
void readPhone(struct order *current);
void readSize(struct order *current);

//read name
void readName(struct order *current){
    printf("name: ");
    scanf("%80[^\n]", current->name);
   // scanf("%s",current->name);
}

//read email
void readEmail(struct order *current){
    printf("e-mail: ");
    char tmp[80];
    scanf("%s[^\n]",current->email);
}

//read phone number
void readPhone(struct order *current){
    printf("phone: ");
    scanf("%15i[^\n]", current->phonenumber);
}

//read size of order
void readSize(struct order *current){
    printf("size: ");
    scanf("%i", current->size);
}

void checkValues(struct order *current){
    printf("Name: %s \n",current->name);
    printf("e-mail: %s \n", current->email);
    printf("tel: %d \n", current->phonenumber);
    printf("size: %d \n", current->size);
    printf("time: %ld \n", current->systime);
}

//***

int main(k)
{
   struct order current; //struct init

   //read values
   readName(&current);
   readEmail(&current); 
   readPhone(&current); // I got the error here, but only if I try this with numbers, with letters save only 0
   readSize(&current);
   current.systime = time(NULL);

   // ** //
    checkValues(&current);

    return 0;
}

1 Ответ

0 голосов
/ 27 октября 2018

scanf("%15i[^\n]", current->phonenumber);

Как уже указывалось, это должно быть:

scanf("%15i", &current->phonenumber);

(вы повторили ту же ошибку в readSize.)

Как правило, вы должны скомпилировать максимум предупреждений, доступных для вашего компилятора.Хороший компилятор предупредит вас, что вы передаете int на scanf, когда ожидается указатель.

Я хочу сохранить телефонные номера, так что максимум 15 чисел длины целых чисел

В типичной системе sizeof(current->phonenumber) == 4.Это означает, что наибольшее значение, которое вы можете сохранить в этой переменной, составляет INT_MAX == 2147483647.Это только 10 цифр, и подходит не для каждого 10-значного номера.

Если вы хотите сохранить каждое возможное 15-значное число, вам нужно хранить их по-разному (вchar phone[16] или int64_t).

...