分配字符串数组

Posted

技术标签:

【中文标题】分配字符串数组【英文标题】:Allocating array of strings 【发布时间】:2022-01-16 12:46:02 【问题描述】:

今天我在分配 char 数组(字符串数组)时遇到问题,我编写了这个函数来执行此操作,但是在打印数组时,我遇到了一些内存问题(例如 Segmentation Fault)。 这是我的尝试:

char **alloca_memoria(char **linguaggio, 
                      int n_sequenze, 
                      int *errore) 

    int i;        
    
    linguaggio = (char**) calloc( n_sequenze,
                                  sizeof(char*));
    
    if (linguaggio != NULL) 
          
        for ( i = 0;
              i < n_sequenze;
              i++ )
        
            linguaggio[i] = (char*) calloc( MAX_SEQ , 
                                            sizeof(char));
            if ( linguaggio[i] == NULL ) 
                *errore = 1;
            else 
                *errore = 0;
        
    
    else 
        *errore = 1;

    return linguaggio; 
    

我的目的只是让它分配内存并返回值错误以检查分配是否成功。 我真的找不到我做错了什么。

附言n_sequenze 是字符串的实际数量,MAX_SEQ 是每个字符串的最大大小。

【问题讨论】:

请发minimal reproducible example。 @WhozCraig 所以在函数中使用 calloc 只是在该函数内部分配内存,而不是在程序内部全局分配内存?所以如果我想让程序工作我必须在主函数中分配内存? 不。阅读 Vlad 的答案,可能会得到一本关于 C 的好书。 【参考方案1】:

如果你想改变函数内传递的指针语言,那么你需要通过引用传递它。例如

char **alloca_memoria(char ***linguaggio, 
                      int n_sequenze, 
                      int *errore) 

    int i;        
    
    *linguaggio = (char**) calloc( n_sequenze,
                                  sizeof(char*));

    //...

    ( *linguaggio )[i] = (char*) calloc( MAX_SEQ , 
                                        sizeof(char));

    //...

    return *linguaggio;

或者最好像这样声明函数

char **alloca_memoria( int n_sequenze, int *errore)

    //... 
    char **linguaggio = (char**) calloc( n_sequenze,
                                  sizeof(char*));
    //...

在调用者中你可以写

char **linguaggio = alloca_memoria( n_sequenze, &errore );

【讨论】:

参数linguaggio 只是多余的,应该删除,而应该使用局部变量。该函数返回一个值。够了。 在参数中输入 ***linguaggio 是否有误,还是我需要这样传递? @Pinguiz 如果要传递指针 linguaggio 声明为 char **linguaggio; 则函数参数声明正确通过引用函数。那就是对应的参数表达式将是 &linguaggio

以上是关于分配字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

指针数组的动态内存分配

将二维指针数组中的字符串分配给一维指针数组

数组字符串的内存分配

C-数组, 字符串的输入输出, 内存分配, 三种内存分配函数

C中的内联字符串数组是不是分配在堆栈上?

C中结构内的字符串数组,无需分配