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

问题描述 投票:0回答:2

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

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.88arg IP:(null)

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

c function malloc dynamic-memory-allocation
2个回答
0
投票

查找错误

[C0中的此语句:

main

表示将mal(argc, argv, &args); 的地址传递给argsmal的类型为args,因此ARGS *的类型为&args

[C0的此定义:

ARGS **

表示mal参数的类型为int mal(int argc , char *argv[], ARGS *args) 。由于args正在传递ARGS *,而不是main,因此这是错误。

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

  • ARGS **中,看不到ARGS *的声明。
  • main中,对mal的调用与其声明不匹配。
  • main的定义与其声明不匹配。

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

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

修复错误

解决错误的一种方法是使main的定义与您在mal中的调用方式匹配。为此,更改mal的定义以使main的类型为mal

args

然后在ARGS **内部,由于int mal(int argc , char *argv[], ARGS **args) 的类型已更改,因此您需要使用mal来引用args传递给它的*args

ARGS *

0
投票

正如@PaulOgilvie在评论中所指出的,main的最后一个参数应该是指向指针的指针:

*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;

您在总机上的呼叫:mal是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.