这是我正在做的一个学校项目的一段代码。
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 编译器一起使用
编辑:我忘记了一些台词,我的坏。
if 语句中缺少括号。它应该是:
if((ptrLocation = malloc(sizeof(struct Location))) == NULL) return NULL;
我将以下内容作为测试放入代码板中,它运行没有问题。
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;
}
也许你把你的创造位置称为无数次? 或者也许在您的代码中的其他地方,您已经覆盖了您的堆,这表现为错误的 malloc 调用? 我会考虑查看您的其余代码,因为提供的代码(除了括号顺序)很好。
刚刚意识到问题可能是什么
由于您在 if 中缺少括号,因此很有可能永远不会调用 malloc,这可能导致赛格错误。
尝试:
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。
该程序在第一次看来是正确的。但是,调用 malloc 函数的行中有一个分钟错误。
请注意,下面的代码是指向结构的指针的声明。
typedef struct Location *PtrLocation;
在现代编译器中,指针的内存分配为 4 个字节,但整个结构具有更大的大小。因此,在 malloc 上存在由于错误初始化而导致的分段错误。Malloc 正在从"PtrLocation"中的整数变量转换为"struct Location"
空间中存在这种差异,导致分段错误。