我在检查结构的成员是否为null时遇到了问题。例如:
typedef struct {
int value;
} A;
int main() {
A *foo = malloc(sizeof(A));
foo->value++; // obviously, null pointer error
}
然后我尝试通过以下方式检查值是否为NULL:
if (foo->value != NULL) {
foo->value++;
}
但是发生了错误:指针和整数之间的比较。
我该怎么办?请注意,在我的情况下,将其设置为0
不是一种选择。
答案 0 :(得分:6)
你可能意味着
if (foo)
foo->value++;
你的评论“显然是空指针错误”对我来说并不那么明显。
答案 1 :(得分:6)
foo->value++; // obviously, null pointer error
对我来说不是很明显为什么这是一个错误。 value
是int
,而不是int *
,那么它怎么能成为NULL指针?
我认为您打算执行以下检查
A *foo = malloc(sizeof(A));
if( foo != NULL ) {
foo->value++; // increment value
} else {
// allocation failed, do something about it
}
当malloc
为结构分配足够的内存以包含该结构的所有成员时;你没有为每个成员分配内存。
请注意,malloc
调用后,结构本身的内容未初始化。要将成员设置为确定性状态,您可以执行以下任一操作:
foo->value = 0;
同样初始化所有其他成员memset( foo, 0, sizeof(*foo) );
这会将结构中的所有位设置为零A *foo = calloc( 1, sizeof(A) );
calloc
自动将零初始化已分配的内存答案 2 :(得分:1)
int
不是指针。它不能是NULL
(或者至少该值与零无法区分)。
答案 3 :(得分:0)
这是一个int,而不是指针,因此将它与NULL进行比较没有多大意义。如果您希望能够这样做,那么您需要在结构中将其声明为int*
。否则,只需确保在创建结构时将其初始化为0.
为了扩展上述内容,重要的是要注意当malloc()结构时,该int的空间在malloc()提供的空间中是ALREADY。结构字面上包含int,而不仅仅是指向它的指针。
答案 4 :(得分:0)
int
类型不是指针,因此它不能是NULL
指针。当您创建一个结构时,会为您的值分配足够的空间,但您仍需要初始化其内容,否则它们将被设置为之前在已分配空间中的内容,有时最好使用另一个函数完成。
A *createA()
{
A *a = malloc(sizeof(A));
//TODO: make sure a is no null
a->value = 0;
return a;
}
现在,调用createA
将始终返回一个int值设置为0的结构。
答案 5 :(得分:0)
正如其他人所指出的,int不是指针类型,不能为NULL。但是,我相信你试图通过“明显的空指针错误”评论得到的结论是,从malloc获得的内存未初始化,因此foo->value++
不一定会留下1
。要解决此问题,您可以使用calloc或memset:
释放calloc:
int main() {
A *foo = calloc(1, sizeof(A)); // returns 0'd memory
foo->value++;
}
memset的:
int main() {
A *foo = malloc(sizeof(A));
memset(foo, 0, sizeof(*foo)); // sets the contents of the struct to 0
foo->value++;
}
你也可以手动0字段,这样可以正常工作,但你可以保持开放状态,忘记将稍后添加到结构中的新字段归零。