这是我正在研究的学校项目的一段代码。
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);
我的程序给了我一个分段错误错误
我的一个朋友对他的项目做了同样的事情,看起来它正在发挥作用。我们正在使用CodeBlocks IDE和GNU GCC编译器 编辑:我忘了一些台词,不好。答案 0 :(得分:1)
您在if语句中缺少一个括号。 它应该是:
if((ptrLocation = malloc(sizeof(struct Location))) == NULL) return NULL;
答案 1 :(得分:0)
我将以下内容放入键盘作为测试,它没有问题。
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调用?我考虑将代码的其余部分看作提供的代码,除了括号顺序外,还可以。
刚刚意识到问题可能是什么
由于if中缺少括号,因此很可能永远不会调用malloc,这可能会导致seg-fault。
答案 2 :(得分:0)
尝试:
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. http://en.cppreference.com/w/c/language/operator_precedence
答案 3 :(得分:0)
该程序第一次似乎是正确的。但是,调用malloc函数的行中有一分钟错误。
请注意,下面的代码是指向结构的指针的声明。
typedef struct Location *PtrLocation;
在现代编译器中,指针的内存分配为4个字节,但整个结构的大小更大。因此,在malloc上存在由于错误初始化导致的分段错误。 Malloc正在" PtrLocation"中使用整数变量进行转换。到" struct位置"
导致分段错误的空间存在这种差异。