c - 在c中的另一个函数中分配结构

标签 c function malloc dynamic-memory-allocation

我如何为另一个函数中的结构分配内存而不是在哪里声明结构变量?

typedef struct{
    char *IP_req;
} ARGS;

int main(int argc , char *argv[]){
    ARGS *args = NULL;
    mal(argc, argv, &args);
    printf("arg IP:%s\n", &args->IP_req);
    return 0;
}

我要分配的函数:

int mal(int argc , char *argv[], ARGS *args){
    args=malloc(sizeof (ARGS));
    args->IP_req = (char*)malloc(sizeof(char) * 200);
    strcpy(args->IP_req,"12.21.51.88");
    printf("arg IP:%s\n", args->IP_req);
    return 0;
}

当我编译这个程序时,我得到:
arg IP:12.21.51.88
arg IP:(null)

但我期望(并且想要):
arg IP:12.21.51.88
arg IP:12.21.51.88

最佳答案

找出错误

main 中的语句:

mal(argc, argv, &args);

表示将args 的地址传递给malargs的类型是ARGS *,所以&args的类型是ARGS **

mal 的定义:

int mal(int argc , char *argv[], ARGS *args)

表示 args 参数的类型为 ARGS *。由于 main 传递的是 ARGS **,而不是 ARGS *,这是一个错误。

如果您正确使用编译器,它应该会警告您以下情况之一:

  • main 中,没有可见的 mal 声明。
  • main 中,对 mal 的调用与其声明不匹配。
  • mal 的定义与其声明不匹配。

如果编译器至少没有警告您其中之一,那么您需要确保完成两件事:

  • 打开或增加编译器中的警告。如果您通过命令行使用 GCC 或 Clang,请将 -Wall 添加到命令行开关。如果您使用的是其他接口(interface)或其他编译器,请参阅其文档。
  • mal 的声明放在头文件中,并使用 #include 将该头文件包含在包含 main 和包含 mal 的源文件。

将声明放在头文件中并将该文件包含在每个源文件中是比将声明复制到每个源文件更好的解决方案,因为它确保每个源文件使用相同的声明。并启用编译器警告——并注意它们——确保有一个完整的链检查类型——mainmal 的使用与其声明相关联,并且其声明与其定义有关。这使编译器能够进行所有类型检查。

修复错误

修复错误的一种方法是使 mal 的定义与您在 main 中调用它的方式相匹配。为此,请更改 mal 的定义,使 args 具有 ARGS ** 类型:

int mal(int argc , char *argv[], ARGS **args)

然后在里面,mal,由于args的类型发生了变化,所以需要用*args来引用 main 传递给它的 ARGS *:

*args = malloc(sizeof (ARGS));
(*args)->IP_req = malloc(sizeof(char) * 200);
strcpy((*args)->IP_req,"12.21.51.88");
printf("arg IP:%s\n", (*args)->IP_req);
return 0;

其他说明

main 中,当用 %s 打印字符串时,不要传递数组的地址,如 printf("arg IP:%s\n", &args->IP_req);.使用 printf("arg IP:%s\n", args->IP_req); 传递数组第一个元素的地址。 (尽管 args->IP_req 最初是指数组,但在这种情况下和大多数上下文中,它会自动转换为指向其第一个元素的指针。)

在 C 中(与 C++ 不同),您不需要转换 malloc 的结果,因此 args->IP_req = (char*)malloc(sizeof(char) * 200) ; 可以只是 args->IP_req = malloc(sizeof(char) * 200);

当计算大小传递给malloc时,最好这样使用sizeof:

*args = malloc(size **args);
args->IP_req = malloc(200 * sizeof *args->IP_req);

这样,被分配对象的大小会被自动使用——如果以后对代码的编辑更改了声明 argsargs->IP_req 的类型,这些表达式自动使用新大小。有必要在两个或更多地方更改类型(一个在声明中,一个在每个 malloc 中)。

关于c - 在c中的另一个函数中分配结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58234961/

相关文章:

c - 旋转函数,使用 C 中的递归,以数组和整数作为输入

C哈希表段错误问题

c - Linux内核模块无线接口(interface)比特率

c - 打印字符串指针导致 C 中的输出损坏

C - malloc 和结构、段错误

c++ - 在其他函数中设置结构成员的值

c - 编译器如何在中等内存模型中解析地址?

PHP 从函数内的另一个函数获取值

javascript - 避免 eval(),我需要一种将多个参数传递给变量函数的方法

c - 编写自己的 malloc