【问题标题】:Passing array from main function to other functions in C将数组从主函数传递给C中的其他函数
【发布时间】:2021-02-21 11:02:25
【问题描述】:

我有一个在主函数中初始化的动态字符串数组,但我不确定如何正确使用指针并将我的数组发送给函数。在 function_w 中,我想使用数组,然后将其发送回主函数,然后在其他函数中使用。 这是我的代码:

char function_w(char **array,FILE **fr)
{
int i = 0, strcount = 0;
int buf_length = 50; 
char buf [buf_length],p = NULL;
fseek(*fr, 0, SEEK_SET);

 while (fgets(buf, buf_length, *fr) != NULL)
 {
    array = (char **)realloc(array, (strcount + 1) * sizeof(char *));
    array[strcount++] = strdup(buf);
 }
return p;
}

int main(void)
{   
    char **array = NULL;
    FILE*fr = NULL; //file is opened in other function, before calling w
...
    if (fr != NULL) **array = function_w(array,&fr);
    else printf("Error");
return 0;
}

每次我使用 function_w 时都没有输出。你能帮帮我吗?

【问题讨论】:

  • 我的c技能有点过时但不应该是*fr而不是&fr
  • @SimonDanninger 不,因为您通常不会触及结构的内容(?)FILE。它应该是fr,我认为应该相应地更改参数。

标签: arrays c file pointers dynamic-arrays


【解决方案1】:
  • 要让函数修改传递的内容,请将指针传递给应该修改的内容。在这种情况下应该修改的是char**,所以指向它的指针是char***
  • function_w 的调用者需要strcount 的信息,所以你应该返回它。
  • 您不需要指向FILE* 的指针,因为您不需要修改它。

应用这些,你的程序应该是这样的:

int function_w(char ***array,FILE *fr)
{
    int i = 0, strcount = 0;
    int buf_length = 50; 
    char buf [buf_length],p = NULL;
    fseek(fr, 0, SEEK_SET);

    while (fgets(buf, buf_length, fr) != NULL)
    {
        *array = realloc(*array, (strcount + 1) * sizeof(char *));
        (*array)[strcount++] = strdup(buf);
    }
    return strcount;
}

int main(void)
{   
    char **array = NULL;
    FILE*fr = NULL; //file is opened in other function, before calling w
    int strcount;
...
    if (fr != NULL) strcount = function_w(&array,fr);
    else printf("Error");
    return 0;
}

【讨论】:

  • 谢谢!但是现在我发现了另一个问题:(当我想打印我的数组时,它只打印数组的第一项。'for(i = 0; i
  • @Cassie 令人惊讶的是,代码打印了数组的第一项。在我看来,这将导致分段错误。这不是不可能的,因为 undefined behavior 允许任何事情。
  • @Cassie 啊,或者代码在函数function_w,而不是main?然后像我一样使用(*array)[i]
  • 我不敢相信问题出在括号 xD 上。再次感谢你。我是编程新手,所以我还不懂指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多