这个C程序有什么问题

时间:2016-11-14 18:50:50

标签: c

我正在尝试编写一个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程序了。请告诉我哪里错了,因为我一直在分段错误。

2 个答案:

答案 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