【问题标题】:C-Segmentation Fault: 11C 段错误:11
【发布时间】:2020-07-10 05:06:11
【问题描述】:

我的代码中有分段错误: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,...): 警告:传递 'strcpy' 的参数 1 使指针来自整数而不进行强制转换。

我真的不明白为什么会出现这两个警告。 worker.addr 不是 `char*` 吗?我在结构中定义了它。

但我也很奇怪,我没有收到第一个 worker.addr 分配的任何警告,只是对第二个分配。

【问题讨论】:

  • struct成员定义中char* name,addr,days;只有name是一个指针。请写为char *name, *addr, *days; * 限定后面的变量,而不是前面的类型,即使它放在类型旁边。所以char* namechar *name 完全一样。
  • @Eraklon 抱歉回滚编辑:您的外观更改消除了混乱。
  • @WeatherVane 没有难过的感觉。
  • @WeatherVane 谢谢。抱歉,这是一个基本的解决方案,但我之前无法弄清楚。

标签: c pointers segmentation-fault warnings strcpy


【解决方案1】:

这不是你想的那样:

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% 的情况下是这样。当您看到此类警告时,请将其视为错误。

【讨论】:

  • 是的,谢谢,它解决了我的问题!是的,我试图解决它,我只是没有注意到问题可能出在结构中。
  • 顺便说一句,这同样适用于普通的变量声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2016-04-22
相关资源
最近更新 更多