C 项目中的分段错误



这是我正在做的一个学校项目的一段代码。

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"

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

相关内容

  • 没有找到相关文章

最新更新