如何解决调用malloc后C程序退出
#define ACTION_LIST_N 3
#define MALLOC 1
#define REALLOC 2
typedef struct action action_t;
struct action {
char name; // action name
state_t precon; // precondition
state_t effect; // effect
};
main(int argc,char *argv[]) {
action_t** action_list;
make_action_list(action_list,ACTION_LIST_N,MALLOC);
action_list[0] = (action_t*)malloc(sizeof(**action_list));
printf("1"); <- DOES NOT EXECUTE
return 0;
}
void
make_action_list(action_t** action_list,int n,int request) {
if (request==MALLOC) {
action_list = (action_t**)malloc(n * sizeof(*action_list));
if_null(action_list,"Initial allocation failure");
} else if (request==REALLOC) {
action_list = (action_t**)realloc((action_t**)action_list,(n*2)*sizeof(*action_list));
if_null(action_list,"Realloc failure");
}
}
很长的帖子,很抱歉,但是我真的很困,不知道如何解决这个问题。
我制作了一个指向结构的指针数组(action_list),并使用make_action_list()将内存分配给了action_list。但是,当我尝试在数组的第一个指针上调用malloc时,程序将退出而没有任何警告消息,并且永远不会打印“ 1”。我究竟做错了什么?预先感谢。
我在这里关注有关动态数组的教程:C: pointer to array of pointers to structures (allocation/deallocation issues)
解决方法
分配给action_list
的值在内部的功能不变在action_list
中的main
的值。
要解决此问题,您有两种选择:
选项1。让函数返回一个指针
赞:
void* make_action_list(int n,int request) {
...
return ALLOCATED_MEMORY;
}
打个电话
action_list = make_action_list(ACTION_LIST_N,MALLOC);
选项2。将指针传递到action_list
喜欢
void make_action_list(action_t*** action_list,int n,int request) {
^^^
Notice
并致电:
make_action_list(&action_list,ACTION_LIST_N,MALLOC);
,
我们一个一个地走。
action_t** action_list;
您的操作“列表”看起来像是使用方式的数组,因此它应该是单个指针。
make_action_list(action_list,MALLOC);
使先前的定义成为单个指针会将该行更改为更加标准的make_action_list(&action_list,MALLOC);
,将指针传递给指针,以便函数可以对其进行修改。
action_list = (action_t**)malloc(n * sizeof(*action_list));
您不想分配n
指针,而是想分配n
动作。因此,此行应为*action_list = malloc(n * sizeof(action_list));
(请注意,您也不需要强制转换malloc
中的指针,这样做表明您不了解C强制转换规则)。
action_list = (action_t**)realloc((action_t**)action_list,(n*2)*sizeof(*action_list));
类似于以上,您想重新分配操作,而不是指针。但是,您编写此方法的方式是一个巨大的问题,因为realloc
可能会失败并返回0
,并将其直接分配给操作列表将使原始指针消失,从而导致内存泄漏。现代C ++专门针对这种情况发出警告。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。