是什么导致该指针损坏?

时间:2020-07-09 13:21:35

标签: c pointers segmentation-fault intel-fpga heap-corruption

首先,此代码在我的Linux台式机(x86_64)上运行没有任何问题,但是在Cyclone v(arm cpu / fpga)上却出现了段错误,因为指针的值正在更改。相关的行是最后一行,在for循环中,“ layer-> filename”的值正在更改,它在第一次迭代(由malloc给定的地址)中是正确的,但在第二次迭代中是更改的。

基本上,这段代码将字符从“ buff”复制到“ layer-> filename”,如您在输出文件中看到的那样,buff [i]的值是有效字符,因此它不应破坏图层->文件名。

如果您知道可能导致此问题的原因,请告诉我。

谢谢您的帮助。

typedef enum 
{ 
    CONV,
    BN, 
    FC, 

} layer_type;

typedef struct layer{
    layer_type layer_type;
    int shape[3];
    char *filename;
} layer;

...

layer *layer=malloc(sizeof(layer));

char buff[30];

int i;
...

layer->filename = malloc(sizeof(char)*(n+1));

if(buff[0]=='b')
    layer->layer_type=BN;
else if(buff[0]=='c')
    layer->layer_type=CONV;
else
    layer->layer_type=FC;
for(i=0; i<n ; i++)
    *(layer->filename+i)=buff[i]; 

values of buff[i] and layer->name during the loop

1 个答案:

答案 0 :(得分:1)

使用此代码

#include <stdio.h>
#include <stdlib.h>

typedef enum 
{ 
    CONV,
    BN, 
    FC, 

} layer_type;

typedef struct layer{
    layer_type layer_type;
    int shape[3];
    char *filename;
} layer;

size_t test(size_t x) {
    printf("%d\n", (int)x);
    return x;
}

int main(void) {
    layer *layer=malloc(test(sizeof(layer)));
    return 0;
}

您可以在行中看到sizeof(layer)

layer *layer=malloc(sizeof(layer));

不是结构的大小,而是指针的大小。

这是因为变量的名称与类型名称相同,并且编译器将layer中的sizeof视为变量(指针)名称。

为避免这种情况并让其分配结构的大小,应更改类型或变量的名称,以免造成混淆。

取消引用指针

layer *layer=malloc(sizeof(*layer));

也可以解决此问题,但我认为重命名会更好。