如何为C中的字符**动态分配内存

如何为C中的字符**动态分配内存,c,arrays,c-strings,dynamic-allocation,C,Arrays,C Strings,Dynamic Allocation,在这个函数中,我将如何为char**list动态分配内存 这个程序的基本思想是我必须从一个文件中读入一个单词列表。我不能假设最大字符串或最大字符串长度 我必须用C字串做其他的东西,但我应该可以用这些东西 谢谢 void readFileAndReplace(int argc, char** argv) { FILE *myFile; char** list; char c; int wordLine = 0, counter = 0, i; int max

在这个函数中,我将如何为char**list动态分配内存

这个程序的基本思想是我必须从一个文件中读入一个单词列表。我不能假设最大字符串或最大字符串长度

我必须用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++;
        }
    }
}
void readFileAndReplace(int-argc,char**argv)
{
文件*myFile;
字符**列表;
字符c;
int字线=0,计数器=0,i;
int maxNumberOfChars=0,numberOfLines=0,numberOfChars=0;
myFile=fopen(argv[1],“r”);
如果(!myFile)
{
printf(“无此类文件或目录”);
退出(退出失败);
}
而((c=fgetc(myFile))!=EOF)
{
numberOfChars++;
如果(c=='\n')
{
if(maxNumberOfChars0)
{
列表[字行][计数器]='\0';
wordLine++;
计数器=0;
}
如果(c!='\n'),则为else
{
列表[wordLine][counter]=c;
计数器++;
}
}
}
这样做:

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);  
maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
     if(c == '\n'){
         numberOfLines++; 
         if(maxNumberOfChars < numberOfChars)
             maxNumberOfChars = numberOfChars;
         numberOfChars=0
     }
     numberOfChars++;
}    
wordLine
counter
0

在此代码之前:

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

你的第三个问题的新版本。您正在读取文件两次。所以,在第二个循环开始之前,您需要先创建第一个字符

尝试:

fseek(fp, 0, SEEK_SET); // same as rewind()
rewind(fp);             // same as fseek(fp, 0, SEEK_SET)
另外,我对您计算
numberOfLines
maxNumberOfChars
的逻辑有疑问。请检查一下

编辑

我认为您对
maxNumberOfChars=0,numberOfLines=0的计算是错误的尝试如下:

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);  
maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
     if(c == '\n'){
         numberOfLines++; 
         if(maxNumberOfChars < numberOfChars)
             maxNumberOfChars = numberOfChars;
         numberOfChars=0
     }
     numberOfChars++;
}    

如果我是你,我会使用
mmap
将文件映射到私有内存,然后在文件上迭代,将单词的开头存储在
char**
数组中,可以随着
realloc
的使用而增加,并用0替换换行符

这样,您就可以将单词作为一个连续块存储在内存中,而不必关心文件I/O,因为您可以将整个文本文件作为
char*
存储在内存中,并且不必对数组进行malloc

有关函数的信息,请参阅相应的手册页,或给我留言:)

编辑:如果您还不知道mmap,请查看以下内容:


如今,大多数C程序员仍然尝试使用
fopen
和friends将文件读入内存,但这是完全不必要的,而且会带来额外的复杂性。(缓冲,不断增长的阵列,…)和
mmap
是一个很好的替代方案,它将所有讨厌的工作转移到操作系统上

尝试了它,我遇到了seg故障。我将编辑我的代码以显示我是如何实现它的。感谢您的快速回复。我指定了wordLine和counter的值,但仍然不起作用。@CarlosCarrillo现在有什么问题吗。在
malloc()
之前打印出您的
字线和计数器以检查值。如果我事先不知道字线?我是否必须切换到使用链表,链表中的每个节点代表一个单词?@viki.omega9如果您无法计算需要的大小,那么您有两种方法(1)(2)链表
maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
     if(c == '\n'){
         numberOfLines++; 
         if(maxNumberOfChars < numberOfChars)
             maxNumberOfChars = numberOfChars;
         numberOfChars=0
     }
     numberOfChars++;
}    
malloc(sizeof(char)*(maxNumberOfChars + 1));