我正在尝试在此函数中创建一个内存池,如果成功创建了池,则返回true。 这个函数应该创建一个内存池,名称传递为“* name”,大小为“int size”。
boolean create_memory_pool(char *name, int size)
{
boolean task;
task = (name = (char *) malloc (size));
if(task == true)
printf("task is true memory pool created");
else if(task ==false)
printf("task is false");
else
printf("unexpected");
return task;
}
它的印刷“意外”意味着其他事情正在发生。 我已将布尔值定义为:
typedef enum{
false,
true
}boolean;
答案 0 :(得分:2)
malloc
之后,name
如果成功则为非空指针,否则为空指针。
因此表达式name = (char *) malloc (size)
的类型为char *
,您将此值分配给task
,因为您没有使用强制转换,所以应该会给出警告。
在成功的malloc
中,指针name
是非空的,这不是整数1
,这就是为什么task
不等于{{1} } {({1}}),而不是true
(1
)
实际上你不需要false
,只测试值0
是否为空指针:
task
答案 1 :(得分:1)
要使其正常使用
task = ((name = (char *) malloc (size))!=NULL);
C中的所有内容都返回一个值。而enum
基本上是int
。
当你说
task = (name = (char *) malloc (size));
表达式(name = (char *) malloc (size));
也返回值。该表达式返回的值是指针。
task
获取指针值。所以它正在打印unexpected
答案 2 :(得分:1)
解决您问题的最简单方法是确保task
只获得1
或0
,而不是当前代码,而是为其分配指针值。以下代码将执行此操作:
task = !!(name = malloc(size));
如果!
返回malloc
,则1
运算符会将malloc
调用的结果转换为NULL
,否则将0
转换为!
并且下一个1
运算符会将其更改回您关注的0
或_Bool task;
。
或者,使用真正的布尔类型而不是滚动自己的类型:
bool task;
或:
#include <stdbool.h>
如果你先example.c:12:8: warning: incompatible pointer to integer conversion assigning to
'boolean' from 'char *' [-Wint-conversion]
task = (name = (char *) malloc (size));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
。
注意:我还删除了不必要的类型转换。你当前的代码可能应该给你一个关于将指针转换为没有强制转换的整数的警告 - 你应该注意这样的警告并适当地纠正代码。例如,来自clang:
{{1}}
答案 3 :(得分:0)
首先,当您执行类似
的操作时task = (name = (char *) malloc(size));
你说这个任务和名字一样。由于name获得malloc的返回,这将是一个内存地址。所以任务不可能是真或假。 而是尝试类似的东西 如果(任务) 返回true; 否则返回false;
其次,name是函数的输入参数。您的来电者将无法读取输出。 目前尚不清楚为什么要调用名称输入名称;它从未被用作任何东西的名称,实际上从未读过。而是将malloc的输出分配给它。 这可能不是你想要的。
答案 4 :(得分:0)
如果无法分配内存,则malloc将返回NULL(即0,在您的情况下为false)。 如果成功分配了一个内存,它将返回新分配的内存的地址,该内存不一定是1.您的true设置为1,因此所有不等于1的值都不会为'true'。这就是为什么你会出乎意料,即使它是成功的。
你能做的是
if(task ==false)
printf("task is false");
else
printf("task is true memory pool created");