【问题标题】:What could cause this pointer to be corrupted? [closed]什么可能导致这个指针被破坏? [关闭]
【发布时间】: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]; 

values of buff[i] and layer->name during the loop

【问题讨论】:

  • *(layer-&gt;filename+i)你为什么要写这样的代码?
  • 什么是n?????
  • 从文本文件中读取一行时,n 是空格前的字符数,我得到文件名的大小为 n+1,因为我在复制文件名后添加了一个 '\0' 字符我从文本文件中获取。
  • for(i=0; i&lt;n ; i++) *(layer-&gt;filename+i)=buff[i]; 可以是memcpy(layer-&gt;filename, buff, sizeof(char)*n); 哦,您似乎忘记初始化分配给layer-&gt;filename 的缓冲区的最后一个元素。
  • 请注意,在您的循环中for(i=0; i&lt;n ; i++)*(layer-&gt;filename+i)=buff[i];不会以空值终止文件名。要做到这一点,要么明确地做,要么写for(i=0; i&lt;=n ; i++)

标签: c pointers segmentation-fault intel-fpga heap-corruption


【解决方案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));

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

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

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

取消引用指针

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

也可以解决这个问题,不过我觉得重命名比较好。

【讨论】:

  • 你确定编译器取的是变量而不是同名的类型吗?
  • 我不确定,但你是对的,使用同名不是一个好主意
  • 所以我检查了 sizeof(layer) 是 20 字节。
  • @CitizenAA289 你是怎么检查的?
  • @MikeCAT 我在 malloc 之前放了一个 printf 并打印了 sizeof(layer)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2016-01-24
相关资源
最近更新 更多