什么会导致此指针损坏?

What could cause this pointer to be corrupted?

首先,此代码 运行 在我的 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

使用此代码

#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));

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

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

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

取消引用指针

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

也可以解决这个问题,但我觉得重命名更好