【发布时间】:2020-07-09 13:21:35
【问题描述】:
首先,这段代码在我的 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];
【问题讨论】:
-
*(layer->filename+i)你为什么要写这样的代码? -
什么是
n????? -
从文本文件中读取一行时,n 是空格前的字符数,我得到文件名的大小为 n+1,因为我在复制文件名后添加了一个 '\0' 字符我从文本文件中获取。
-
for(i=0; i<n ; i++) *(layer->filename+i)=buff[i];可以是memcpy(layer->filename, buff, sizeof(char)*n);哦,您似乎忘记初始化分配给layer->filename的缓冲区的最后一个元素。 -
请注意,在您的循环中
for(i=0; i<n ; i++)、*(layer->filename+i)=buff[i];将不会以空值终止文件名。要做到这一点,要么明确地做,要么写for(i=0; i<=n ; i++)。
标签: c pointers segmentation-fault intel-fpga heap-corruption