C项目中的分段错误
这是我正在做的一个学校项目的一段代码C项目中的分段错误,c,segmentation-fault,C,Segmentation Fault,这是我正在做的一个学校项目的一段代码 typedef struct Location{ int x; int y; int hasTreasure; }Location; typedef struct Location *PtrLocation; PtrLocation createLocation(int x,int y){ PtrLocation ptrLocation; if(ptrLocation= malloc(sizeof(struc
typedef struct Location{
int x;
int y;
int hasTreasure;
}Location;
typedef struct Location *PtrLocation;
PtrLocation createLocation(int x,int y){
PtrLocation ptrLocation;
if(ptrLocation= malloc(sizeof(struct Location)) == NULL) return NO_MEM;
ptrLocation->x=x; // place where the segmentation fault occurs
ptrLocation->y=y;
ptrLocation->hasTreasure=0;
return ptrLocation;
}
每当我尝试在main中运行以下行时:
PtrLocation location;
location = createLocation(5,5);
我的程序给了我一个分段错误
我的一个朋友在他的项目上做了完全相同的事情,看起来它正在工作。我们将代码块IDE与GNU GCC编译器一起使用
编辑:我忘了几行,我的错。我把以下内容作为测试放到了代码板中,它运行时没有问题
typedef struct Location{
int x;
int y;
int hasTreasure;
}Location;
typedef struct Location *PtrLocation;
PtrLocation createLocation(int x,int y){
PtrLocation ptrLocation;
if((ptrLocation= malloc(sizeof(struct Location))) == NULL) return NULL;
ptrLocation->x=x;
ptrLocation->y=y;
ptrLocation->hasTreasure=0;
return ptrLocation;
}
int main(void)
{
PtrLocation location;
location = createLocation(5,5);
return 0;
}
也许你称你的createLocation为百万次?或者在代码的其他地方,您已经覆盖了堆,这表现为错误的malloc调用?我会考虑查看代码中剩下的代码,除了括号顺序之外,很好。< /P>
刚刚意识到问题可能是什么 由于if中缺少括号,因此很有可能从未调用malloc,这可能导致seg故障。尝试:
PtrLocation ptrLocation = malloc(sizeof(Location));
if(ptrLocation == NULL) return NO_MEM;
而不是:
PtrLocation ptrLocation;
if(ptrLocation= malloc(sizeof(struct Location)) == NULL) return NO_MEM;
试图设置if块中无法工作的ptrLocation的值时出现了问题;我能够以这种方式避免一个错误。赋值发生在最后,因此如果要将其放入if块,则需要将整个赋值语句放在括号中,如下所示:
if((ptrLocation= malloc(sizeof(struct Location))) == NULL) return NO_MEM;
*注:赋值的优先级为14,而比较的优先级为7 if语句中缺少括号。 应该是:
if((ptrLocation = malloc(sizeof(struct Location))) == NULL) return NULL;
这个程序一开始似乎是正确的。但是,调用malloc函数的行中有一个小错误 请注意,下面的代码是指向该结构的指针的声明
typedef struct Location *PtrLocation;
在现代编译器中,指针的内存分配为4字节,但整体结构的大小更大。因此,在malloc上存在由于错误初始化导致的分段错误。Malloc正在从“PtrLocation”中的整数变量转换为“struct Location”
导致分段错误的空间存在这种差异。您确定分段错误发生在该功能中吗?一个行号肯定会对我们有所帮助。使用所有警告和调试信息编译<代码>gcc-Wall-Wextra-g。然后使用调试器(
gdb
)和valgrind
@michaeldorgen该行出现分段错误:ptrLocation->x=x;尝试将ptrLocation=malloc(sizeof(struct Location))
括在括号中,如(ptrLocation=malloc(sizeof(struct Location)))
@Fjotten您是上帝