【问题标题】:C - Segmentation fault : 11C - 分段错误:11
【发布时间】:2016-01-10 14:07:03
【问题描述】:

您好,我必须为我的大学做一个磁盘模拟。

我有 2 个文件:

ttfs.h:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

typedef struct _disk disk;
typedef struct _block block;

struct _block{
    uint8_t *unBlock;
};

struct _disk{
    int id;
    block *diskBlock;
};

tfs_create.c:

#include "tttfs.h"

uint8_t little[4];

int tttfs_create(int size, char *name);
void inttolitend(uint32_t x, uint8_t* lit_int);

int main(){
    tttfs_create(7, "disk.tfs");
}

int tttfs_create(int size, char *name){
    FILE *f = NULL;
    if ((f = fopen(name, "wb"))!=NULL)
    {
    disk *d = malloc(sizeof(disk));
    d->diskBlock = malloc(1024);
    d->id = 1;
    int i;
    for(i = 0; i<size; i++){
       printf("%d\n", i);
       d->diskBlock[i].unBlock = malloc(1024); //I got the segmentation fault here
    }
    inttolitend(size, little);
    for(i = 0; i<4; i++){
       d->diskBlock[0].unBlock[i] = little[i];
    }
    for(i = 0; i<size; i++){
       fwrite(&d->diskBlock[i],1024,1,f);
    }
    }
    else
        printf("Erreur\n\n");
    return 0;
}

void inttolitend(uint32_t x, uint8_t* lit_int){
   lit_int[3] = (uint8_t)x / (256*256*256);
   lit_int[2] = (uint8_t)(x % (256*256*256)) / (256*256);
   lit_int[1] = (uint8_t)((x % (256*256*256)) % (256*256)) / 256;
   lit_int[0] = (uint8_t)((x % (256*256*256)) % (256*256)) % 256;
}

我想在文件中写入多个块(这里是 7 个),所以我对磁盘结构的大小执行 malloc,然后在 diskBlock 上执行 malloc 以创建表 d->diskBlock[0].unBlock = malloc(1024);但不是更多。我怎么能用我的 struct 做一个 block[size] ? (我不擅长c)

【问题讨论】:

  • 1. Alaways 检查 malloc()NULL 的返回值。 2. 为什么是d-&gt;diskBlock = malloc(1024);?应该是malloc(size * sizeof(block));!
  • 为什么是d-&gt;diskBlock = malloc(1024);?不要使用幻数。
  • 我想要那个 uint8_t *unBlock = malloc(1024);
  • 当你在做 d-&gt;diskBlock = malloc(1024) 时,你分配了 1024 个 bytes 而不是 1024 block 结构。虽然它可能不是导致崩溃的原因,但它一个问题。
  • 这个fwrite(&amp;d-&gt;diskBlock[i],1024,1,f); 似乎是问题所在,你在用它做什么?

标签: c segmentation-fault malloc


【解决方案1】:

我认为你应该改变这一行

d->diskBlock = malloc(1024);

d->diskBlock = malloc(sizeof(block) * size);

还有,这个

d->diskBlock[i].unBlock = malloc(1024);

d->diskBlock[i].unBlock = malloc(sizeof(uint8_t) * 4);

【讨论】:

  • 但我不认为这会触发SIGSEGV。 1024空间够用,绰绰有余。假设 64 位指针,它需要最大 7 * sizeof(block)56B
  • 我的块上怎么会有 malloc(1024) ?我需要 block[1024] 长度来模拟磁盘。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多