我如何为另一个函数中的结构分配内存而不是在哪里声明结构变量?
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
的地址传递给mal
。 args
的类型是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
的源文件。
将声明放在头文件中并将该文件包含在每个源文件中是比将声明复制到每个源文件更好的解决方案,因为它确保每个源文件使用相同的声明。并启用编译器警告——并注意它们——确保有一个完整的链检查类型——main
中 mal
的使用与其声明相关联,并且其声明与其定义有关。这使编译器能够进行所有类型检查。
修复错误
修复错误的一种方法是使 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);
这样,被分配对象的大小会被自动使用——如果以后对代码的编辑更改了声明 args
或 args->IP_req
的类型,这些表达式自动使用新大小。有必要在两个或更多地方更改类型(一个在声明中,一个在每个 malloc
中)。
关于c - 在c中的另一个函数中分配结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58234961/