C -Segmentation Fault: 11 - PullRequest
       26

C -Segmentation Fault: 11

0 голосов
/ 29 марта 2020

Я получил ошибку сегментации: 11 в моем коде, и я не мог понять, почему. Я получил его после второго fgets.

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

typedef struct Worker {
char*  name,addr,days;
} Worker;

int main(){

printf("You chose the 1st (New Data) action\n");
printf("Please give your name (Max 20 character):  ");
int const maxNameLength = 20;
Worker worker;

char tmpName[maxNameLength];
fgets(tmpName,maxNameLength,stdin);

worker.name = (char*)malloc(sizeof(char)*(strlen(tmpName)+1));
strcpy(worker.name,tmpName);
printf("\n");

printf("Please give your address (Max 30 character): ");
int const maxAddrLength = 30;

char tmpAddr[maxAddrLength];
fgets(tmpAddr,maxAddrLength,stdin);

worker.addr = (char*) malloc(sizeof(char)*(strlen(tmpAddr)+1));
strcpy(worker.addr,tmpAddr);
printf("\n");

free(worker.name);
}

Когда я его скомпилирую, я получаю 2 предупреждения:

Первое:

. c : 31: 17 (worker.addr = ...): предупреждение: присваивание делает целое число из указателя без приведения

Второй:

. c: 32:12 (strcpy (worker.addr, ...): предупреждение: передача аргумента 1 'strcpy' делает указатель из целого числа без приведения.

Я действительно не понимаю, почему эти два здесь есть предупреждения. Разве это worker.addr не `char *` `? Я определил это в структуре.

Однако мне также странно, что я не получил никакого предупреждения в первый раз worker.addr присваивание, только для второго.

1 Ответ

1 голос
/ 30 марта 2020

Это не то, что вы думаете:

typedef struct Worker {
  char*  name,addr,days;
} Worker;

это эквивалентно

typedef struct Worker {
  char *name;
  char addr;
  char days;
} Worker;

Этой информации должно быть достаточно, чтобы вы могли понять, что не так.

Кстати, предупреждения makes integer from pointer without a cast на самом деле скорее ошибки, по крайней мере, в 99% всех случаев. Когда вы видите такое предупреждение, считайте его ошибкой.

...