C项目中的分段错误

时间:2016-04-25 17:18:39

标签: 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(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编译器

编辑:我忘了一些台词,不好。

4 个答案:

答案 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位置"

导致分段错误的空间存在这种差异。