如何动态分配内存对于char **用C(How to dynamically allocate me

2019-08-16 21:14发布

我怎么会去了解动态分配内存为char **在这个函数列表?

基本上这个项目的想法是我从文件中的单词列表读取。 我不能假设最大字符串或最大字符串长度。

我必须做其他的东西与C字符串,但这些东西我应该工作正常。

谢谢!

void readFileAndReplace(int argc, char** argv)
{
    FILE *myFile;
    char** list;
    char c;
    int wordLine = 0, counter = 0, i;
    int maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;

    myFile = fopen(argv[1], "r");

    if(!myFile)
    {
        printf("No such file or directory\n");
        exit(EXIT_FAILURE);
    }

    while((c = fgetc(myFile)) !=EOF)
    {
        numberOfChars++;
        if(c == '\n')
        {
            if(maxNumberOfChars < numberOfChars)
                maxNumberOfChars += numberOfChars + 1;

            numberOfLines++;
        }
    }

    list = malloc(sizeof(char*)*numberOfLines);

    for(i = 0; i < wordLine ; i++)
        list[i] = malloc(sizeof(char)*maxNumberOfChars);


    while((c = fgetc(myFile)) != EOF)
    {
        if(c == '\n' && counter > 0)
        {
            list[wordLine][counter] = '\0';
            wordLine++;
            counter = 0;
        }
        else if(c != '\n')
        {
            list[wordLine][counter] = c;
            counter++;
        }
    }
}

Answer 1:

这样做:

char** list; 

list = malloc(sizeof(char*)*number_of_row);
for(i=0;i<number_of_row; i++) 
  list[i] = malloc(sizeof(char)*number_of_col);  

此外,如果您是动态分配内存。 你释放它为完成工作:

for(i=0;i<number_of_row; i++) 
  free(list[i] );
free(list);  

编辑

在你修改后的问题:

 int wordLine = 0, counter = 0, i;    

wordLinecounter0

在此之前的代码:

list = malloc(sizeof(char*)*wordLine+1);
for(i = 0;i < wordLine ; i++)
   list[i] = malloc(sizeof(char)*counter);  

你必须赋值给wordLinecounter变量

还内存分配应该是以下循环(外)前:

 while((c = fgetc(myFile)) != EOF){
  :
  :
 }

编辑

新的第三个版本问题。 您正在阅读的文件两次。 所以,你需要FSEEK(),快退()到第一个字符的第二循环开始之前。

尝试:

fseek(fp, 0, SEEK_SET); // same as rewind()
rewind(fp);             // same as fseek(fp, 0, SEEK_SET)

我也有疑问,在你的逻辑来计算numberOfLinesmaxNumberOfChars 请检查还

编辑

我觉得你的计算maxNumberOfChars = 0, numberOfLines = 0是尝试这样的错误:

maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
     if(c == '\n'){
         numberOfLines++; 
         if(maxNumberOfChars < numberOfChars)
             maxNumberOfChars = numberOfChars;
         numberOfChars=0
     }
     numberOfChars++;
}    

maxNumberOfChars是在一行字符的最大数量。

同时更改代码:

malloc(sizeof(char)*(maxNumberOfChars + 1));  


Answer 2:

如果我是你,我会映射文件的私有内存,使用mmap ,然后遍历文件,存储的话开始在数组char** ,你可以增加,因为你去realloc和替换换行符与0。

这样的话,你必须在内存中连续的块你的话,你不必关心文件I / O,因为你必须在内存中的整个文本文件char* ,而不必对malloc数组的阵列。

有关功能方面的信息,请参见相应的手册页,或请给我留言:)

编辑:如果你不知道的mmap呢,看看这个: http://www.jimscode.ca/index.php/component/content/article/13-c/45-c-simple-mmap-example

今天大多数C程序员仍然试图读取使用文件加载到内存fopen和朋友,但这是完全没有必要的,并引入了复杂的additionel水平。 (缓冲,越来越多的阵列,...)和mmap是一个很好的替代方案,将所有的肮脏的工作下到OS



文章来源: How to dynamically allocate memory for char** in C