什么会导致此指针损坏?
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));
也可以解决这个问题,但我觉得重命名更好
首先,此代码 运行 在我的 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));
也可以解决这个问题,但我觉得重命名更好