C 什么会导致此指针损坏?

C 什么会导致此指针损坏?,c,pointers,segmentation-fault,intel-fpga,heap-corruption,C,Pointers,Segmentation Fault,Intel Fpga,Heap Corruption,首先,这段代码在我的linux桌面pc(x86_64)上运行没有任何问题,但是在我的Cyclone v(arm cpu/fpga)上,我有一个分段错误,因为指针的值正在更改。相关行是最后一行,在for循环期间,“layer->filename”的值正在更改,在第一次迭代期间它是正确的(malloc给出的地址),但在第二次迭代时它会更改 基本上,这段代码是将字符从“buff”复制到“layer->filename”,正如您在输出文件中看到的,buff[i]的值是一个有效字符,因此它不会损坏laye

首先,这段代码在我的linux桌面pc(x86_64)上运行没有任何问题,但是在我的Cyclone v(arm cpu/fpga)上,我有一个分段错误,因为指针的值正在更改。相关行是最后一行,在for循环期间,“layer->filename”的值正在更改,在第一次迭代期间它是正确的(malloc给出的地址),但在第二次迭代时它会更改

基本上,这段代码是将字符从“buff”复制到“layer->filename”,正如您在输出文件中看到的,buff[i]的值是一个有效字符,因此它不会损坏layer->filename

如果你知道是什么导致了这个问题,请告诉我

谢谢你的帮助

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]; 
typedef枚举
{ 
卷积和多项式相乘,
BN,
FC,
}层型;
类型定义结构层{
图层类型图层类型;
int-shape[3];
字符*文件名;
}层;
...
层*层=malloc(sizeof(层));
字符buff[30];
int i;
...
图层->文件名=malloc(大小(字符)*(n+1));
if(buff[0]=='b')
图层->图层类型=BN;
else if(buff[0]='c')
图层->图层类型=CONV;
其他的
图层->图层类型=FC;
对于(i=0;ifilename+i)=buff[i];
使用此代码

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

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

*(图层->文件名+I)
为什么这样写代码?什么是
n
???从文本文件中读取一行时,n是空格前的字符数,我获取的文件名大小为n+1,因为我在复制从文本文件获取的文件名后添加了一个“\0”字符。
for(I=0;ifilename+I)=buff[I]可以是
memcpy(层->文件名,buff,sizeof(char)*n)哦,似乎您忘记初始化分配给
层->文件名的缓冲区的最后一个元素了。请注意,在循环中
for(i=0;ifilename+i)=buff[i]
将不为null并终止文件名。要做到这一点,要么显式执行,要么为(i=0;i)编写
。你确定编译器采用的是变量而不是相同名称的类型吗?我不确定,但你是对的,使用相同的名称不是一个好主意,因为我检查了sizeof(层)是20字节。@CitizenAA289你是怎么检查的?@MikeCAT我在malloc之前放了一个printf,然后打印了sizeof(层)。
layer *layer=malloc(sizeof(*layer));