【问题标题】: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 是每个字符串的最大大小。

【问题讨论】:

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

标签: c segmentation-fault dynamic-memory-allocation c-strings function-definition


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 2010-10-09
  • 2012-11-10
  • 2020-12-09
相关资源
最近更新 更多