我正在尝试编写一个USB大容量存储驱动程序。我没有存储设备,所以我试图分配一些内存。下面是我写的模拟程序 一个512 * 2048(1 MB)大小的USB驱动器
#include <stdio.h>
#include <stdlib.h>
char ** called_func(char **mem, char start_sec, char num_of_sec)
{
char **read_mem, row, column;
read_mem = (char **)malloc(sizeof(char *) * 512 * num_of_sec);
for(row = 0 ; row < num_of_sec ; row++)
for(column = 0 ; column < 512 ; column++ )
read_mem[row][column] = mem[row + start_sec][column];
return read_mem;
}
int main()
{
char **mem, row , column, i, j;
char **ret;
mem = (char **)malloc(sizeof(char *) * 512 * 2048);
if(mem == NULL)
printf("allocation failed\n");
for(row = 0; row < 2048 ; row++)
for(column = 0 ; column < 512 ; column++)
mem[row][column] = 'a';
ret = called_func(mem, 2, 6);//start sec, num of sectors this time I am going to read from the second sector, and total 6 sectors
for(i=0;i<2;i++)
{
for(j=0;j<6;j++)
{
printf("ret[i][j] = %c",i, j, ret[i][j]);
}
printf("\n");
}
return 0;
}
我几个月没有写过C程序了。请告诉我哪里错了,因为我一直在分段错误。
答案 0 :(得分:0)
第一个问题是你没有为每个char*
分配内存。 mem
是指向指针的指针。这意味着这个值需要分配(就像你一样):
mem = (char **)malloc(sizeof(char*) * 2048);
您可以从代码中删除512
,因为这只需要指针本身的内存而不是指针中的实际字符。
然后您需要malloc
每个人char*
。您可以在for
循环中执行此操作:
mem[row] = malloc(513);
这为每个char
指针分配内存。请记住,您需要在最后添加null
字符的空间。
要free
这些,您需要一个类似于此的循环:
for(row = 0; row < 2048; row++)
{
mem[row];
}
free(mem);
这将摆脱单个指针和双指针。
这足以让您入门,但您的代码还存在一些其他问题。我建议使用某种类型的调试器,或者只是添加print语句来观察代码运行时发生的情况。
答案 1 :(得分:0)
如果你忘记指针概念,我正在做一个非常常见的基本错误。
mem是指向指针的指针。
1.首先,它需要知道它将指向的内存大小.Hence
mem = (char **)malloc(sizeof(char *) * 2048);
2.然后它包含指针。那些指针需要知道它们指向的内存大小,
for(row = 0; row < 2048 ; row++)
mem[row]=(char *)malloc(sizeof(char) * 512);
3。一旦指针知道了它们的极限,我们就可以简单地填充所有指向的内存
for(row=0 ; row < 2048 ; row++)//points to char *
for(column = 0 ; column < 4 ; column++)//points to char
mem[row][column] = 'a';//any data