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您是上帝