我如何在另一个函数中为结构分配内存,而不是在哪里声明结构变量?
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
[C0中的此语句:
main
表示将mal(argc, argv, &args);
的地址传递给args
。 mal
的类型为args
,因此ARGS *
的类型为&args
。
[C0的此定义:
ARGS **
表示mal
参数的类型为int mal(int argc , char *argv[], ARGS *args)
。由于args
正在传递ARGS *
,而不是main
,因此这是错误。
如果您正确使用了编译器,它应该警告您有关以下情况之一:
ARGS **
中,看不到ARGS *
的声明。main
中,对mal
的调用与其声明不匹配。main
的定义与其声明不匹配。如果编译器没有警告您至少其中之一,那么您需要确保完成两项操作:
mal
添加到命令行开关。如果使用的是其他接口或其他编译器,请参阅其文档。mal
的声明,并使用-Wall
将该头文件包含在包含mal
的源文件和包含#include
的源文件中。解决错误的一种方法是使main
的定义与您在mal
中的调用方式匹配。为此,更改mal
的定义以使main
的类型为mal
:
args
然后在ARGS **
内部,由于int mal(int argc , char *argv[], ARGS **args)
的类型已更改,因此您需要使用mal
来引用args
传递给它的*args
:
ARGS *
正如@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
是正确的。