首先,此代码在我的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];
答案 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));
也可以解决此问题,但我认为重命名会更好。