在c中使用字符数组实现64块逻辑磁盘
我对C真的很陌生。。。。 我想要的逻辑磁盘(让我们调用logdisk)必须有64个块,每个块是64字节 比如说,, logdisk[i][j],i是logdisk上逻辑块的数量或索引,j是以字节为单位的块长度 所以 logdisk[5][0]应该给我块5的第一个字节 但是我在创建这个日志磁盘时遇到了麻烦,因为我不知道如何使用malloc分配一个2d字符数组,我有下面的代码在c中使用字符数组实现64块逻辑磁盘,c,arrays,char,C,Arrays,Char,我对C真的很陌生。。。。 我想要的逻辑磁盘(让我们调用logdisk)必须有64个块,每个块是64字节 比如说,, logdisk[i][j],i是logdisk上逻辑块的数量或索引,j是以字节为单位的块长度 所以 logdisk[5][0]应该给我块5的第一个字节 但是我在创建这个日志磁盘时遇到了麻烦,因为我不知道如何使用malloc分配一个2d字符数组,我有下面的代码 char *logdisk = malloc(64 * 64); 有人能告诉我如何创建一个包含64字节块的2d字符
char *logdisk = malloc(64 * 64);
有人能告诉我如何创建一个包含64字节块的2d字符数组吗
谢谢你的评论,现在我得到一些线索
char (*logdisk)[64] = malloc(64*64);
上面一个是Jasen的,下面一个是我的想法,64*64逻辑磁盘应该使用哪一个
char **logdisk = malloc(sizeof(char)*64);
for (int i = 0; i < 64; i++) {
logdisk[i] = malloc(sizeof(char)*64);
}
char**logdisk=malloc(sizeof(char)*64);
对于(int i=0;i<64;i++){
logdisk[i]=malloc(sizeof(char)*64);
}
您可以声明一个字符**
来保存二维数组:
char **logdisk = malloc(64 * sizeof(char *)); // allocate block pointers
int i;
for (i = 0; i < 64; ++i) { // allocate each block
logdisk[i] = malloc(64 * sizeof(char));
}
char**logdisk=malloc(64*sizeof(char*));//分配块指针
int i;
对于(i=0;i<64;++i){//分配每个块
logdisk[i]=malloc(64*sizeof(char));
}
解除分配的方式相同,但相反。您可以声明一个
char**
来保存二维数组:
char **logdisk = malloc(64 * sizeof(char *)); // allocate block pointers
int i;
for (i = 0; i < 64; ++i) { // allocate each block
logdisk[i] = malloc(64 * sizeof(char));
}
char**logdisk=malloc(64*sizeof(char*));//分配块指针
int i;
对于(i=0;i<64;++i){//分配每个块
logdisk[i]=malloc(64*sizeof(char));
}
解除分配的方式相同,但相反。您正在寻找的
或者
其中,磁盘y的字节x由
logdisk[y*64+x];
或
你在找什么
或者
其中,磁盘y的字节x由
logdisk[y*64+x];
或
我使用了无符号char,因为char可以根据您使用的编译器而被签名或未签名,并且大多数人认为字节是未签名的。 这将logdisk定义为指向块(由64个无符号字符组成的数组)的指针
然后你可以说logdisk[5][7],并有块5的第七个字节等等I would do it this way:
#define MAX_DISK_BLOCK_LEN (64)
#define MAX_DISK_BLOCKS (64)
struct diskBlock
{
char diskBlock[MAX_DISK_BLOCK_LEN];
};
struct diskBlock * logDisk = malloc(MAX_DISK_BLOCKS*sizeof(struct diskBlock) );
if( NULL == logDisk )
{
perror( "malloc for logDisk failed" );
exit( EXIT_FAILURE _;
}
// implied else, malloc successful
logDisk[x].diskBlock[y] to access the areas in this logDisk
remembering to keep 'x' to the range 0...(MAX_DISK_BLOCKS-1)
remembering to keep 'y' to the range 0...(MAX_DISK_BLOCK_LEN -1)
我使用了无符号char,因为char可以根据您使用的编译器而被签名或未签名,并且大多数人认为字节是未签名的。 这将logdisk定义为指向块(由64个无符号字符组成的数组)的指针
然后你可以说logdisk[5][7],并有块5的第七个字节等等。无符号字符**logdisk[64]=malloc(sizeof(char)*64);(字符*)的大小如何?我是否需要它?@Noah这首先看起来像是一个语法错误。你
将logdisk声明为指向无符号字符的指针的数组64,然后尝试用标量初始化数组sizeof(char)
永远不需要,它总是1.unsigned char**logdisk[64]=malloc(sizeof(char)*64);(字符*)的大小如何?我是否需要它?@Noah这首先看起来像是一个语法错误。你将logdisk声明为指向无符号字符的指针的数组64,然后尝试用标量初始化数组sizeof(char)
永远不需要,它总是1。是的:)这就是我刚才想的!但是我只需要64*64字节,sizeof(char)*64*64会给我一个不同的内存吗?不会,但在分配中使用sizeof
是一个很好的做法,以确保跨平台的内存大小合适。是的:)这就是我刚才想的!但是我只需要64*64字节,sizeof(char)*64*64会给我一个不同的内存吗?不会,但在分配中使用sizeof
是一个很好的做法,以确保跨平台的内存大小合适。是的:)这就是我刚才想的!但是我只需要64*64字节,大小(char)*64*64会给我一个不同的内存吗?你能告诉我更多关于释放的信息吗?你说的是什么意思?@Noah64*sizeof(char*)
用于分配64个指针的数组注意*
在char
之后,然后循环这次单独分配每个扇区64*sizeof(char)
,实际上是64
@Noah,这将分配64*64个字符,但也分配64个字符指针。我认为这不对,我认为我们应该一次分配整个数组,如果我们在for循环中分配,内存是不连续的。是的:)这就是我刚才想的!但是我只需要64*64字节,大小(char)*64*64会给我一个不同的内存吗?你能告诉我更多关于释放的信息吗?你说的是什么意思?@Noah64*sizeof(char*)
用于分配64个指针的数组注意*
在char
之后,然后循环这次单独分配每个扇区64*sizeof(char)
,实际上是64
@Noah,这将分配64*64个字符,但也会分配64个字符指针。我认为这不对,我认为我们应该一次分配整个数组,如果我们在for循环中分配,内存是不连续的。我不明白您在这里试图实现什么。你说的是逻辑磁盘——很好,然后做char*logdisk=start\u of_disk代码>。为什么你要把一个指针数组分配给更多的数组来描述线性的定义?我不明白你在这里想要实现什么。你说的是逻辑磁盘——很好,然后做char*logdisk=start\u of_disk代码>。为什么要将一个指针数组分配给更多的数组来描述线性定义?
I would do it this way:
#define MAX_DISK_BLOCK_LEN (64)
#define MAX_DISK_BLOCKS (64)
struct diskBlock
{
char diskBlock[MAX_DISK_BLOCK_LEN];
};
struct diskBlock * logDisk = malloc(MAX_DISK_BLOCKS*sizeof(struct diskBlock) );
if( NULL == logDisk )
{
perror( "malloc for logDisk failed" );
exit( EXIT_FAILURE _;
}
// implied else, malloc successful
logDisk[x].diskBlock[y] to access the areas in this logDisk
remembering to keep 'x' to the range 0...(MAX_DISK_BLOCKS-1)
remembering to keep 'y' to the range 0...(MAX_DISK_BLOCK_LEN -1)
I would do it this way:
#define MAX_DISK_BLOCK_LEN (64)
#define MAX_DISK_BLOCKS (64)
struct diskBlock
{
char diskBlock[MAX_DISK_BLOCK_LEN];
};
struct diskBlock * logDisk = malloc(MAX_DISK_BLOCKS*sizeof(struct diskBlock) );
if( NULL == logDisk )
{
perror( "malloc for logDisk failed" );
exit( EXIT_FAILURE _;
}
// implied else, malloc successful
logDisk[x].diskBlock[y] to access the areas in this logDisk
remembering to keep 'x' to the range 0...(MAX_DISK_BLOCKS-1)
remembering to keep 'y' to the range 0...(MAX_DISK_BLOCK_LEN -1)