与结构一起使用时 calloc 的初始值
Initial value of calloc, when using with a struct
我正在尝试使用以下代码编写一个非常简单的散列 table:
#include <stdio.h>
#include <string.h>
#define SIZE 10
typedef struct {
char *first_name;
char *last_name;
} Employee;
typedef struct {
Employee *table;
} Hashtable;
void initHashtable(Hashtable *ht) {
ht->table = (Employee *)calloc(SIZE, sizeof(Employee));
}
int hashKey(char *key) {
int length = strlen(key);
return length % SIZE;
}
void put(Hashtable *ht, Employee emp, char *key) {
int hashedKey = hashKey(key);
ht->table[hashedKey] = emp;
}
我可以通过以下方式插入元素:
int main(int argc, char const *argv[]) {
Employee e1;
e1.first_name = "John";
e1.last_name = "Doe";
Hashtable ht;
initHashtable(&ht);
put(&ht, e1, "Doe");
return 0;
}
但我想修改 "put" 函数,所以当我尝试插入内容时,它会检查该索引是否为空。如果为空则 return 一些消息,如果没有则插入该索引。类似于:
void put(Hashtable *ht, Employee emp, char *key) {
int hashedKey = hashKey(key);
if (ht->table[hashedKey] != 0) {
printf("Employee is in that index!\n");
} else {
ht->table[hashedKey] = emp;
}
}
但是这个 "if statement" 不起作用。所以,我尝试同时使用 0 和 NULL。然后我尝试像这样投射:
if(ht->table[hashedKey] != (Employee *)0)
和
if(ht->table[hashedKey] != (Employee)0)
没有任何效果。我的问题是我知道 calloc 初始化为 0,零。那么在结构的情况下,calloc 用什么初始化?
My question is I knew calloc initializes with 0, zero. Then in case of struct what do calloc initializes with?
calloc
完全不知道您将如何使用内存。它只是给你你要求的数量,所有位都设置为零。看看它的原型:
void * calloc(size_t num, size_t size)
参数num
和size
是只有的信息calloc
。
But this "if statement" is not working.
"not working",我想你的意思是 "does not compile"。
So, i tried with both 0 and
NULL. Then I tried with casting like:
if(ht->table[hashedKey] != (Employee *)0)
and
if(ht->table[hashedKey] != (Employee)0)
Nothing is working.
您的编译器将发出诊断消息,解释为什么它拒绝您的代码。此类诊断有时可能很神秘,但肯定会因为对数据类型的抱怨而导致您问自己这个问题 "what are the types involved here?"。不过,我们可以提供帮助:
ht->table[hashedKey]
的类型为 Employee
(一个结构,而不是指向一个结构的指针)。对于您的目的而言,这可能是最重要的一个,但让我们继续......
0
是类型 int
的常量,它也用作空指针常量(尽管它的类型)。
(Employee *) 0
是类型为 Employee *
的空指针。
(Employee) 0
是无效表达式。它没有类型,因为将 int
转换为 Employee
.
等结构类型是无效的
Employee
等结构类型不是 !=
运算符(或 ==
运算符或大多数其他运算符)的有效操作数。这是你的主要问题。即使您生成了一个所有位都为零的 Employee
表示,这可以通过多种方式完成,您 仍然 无法直接比较它与 [=15 的(不)相等性=] 通过任何 C 的运算符。然而,即使结构 是 可比较的,将结构与任何类型的指针进行比较也没有意义,正如您的第一个示例试图做的那样。
My question is I knew calloc initializes with 0,
zero. Then in case of struct what do calloc initializes with?
这似乎与您的问题没有任何关系,但既然您问了,calloc
初始化了它分配给所有位零的 space。对于整数类型(包括结构的成员),这是 0 的表示。对于其他类型,包括指针类型,语言没有指定此表示的含义。
要检查两个结构是否相等,您需要逐个比较它们。但是,在您的特定情况下,您实际上并不需要比较结构,您只需要检查 one 结构的成员。但是,因为所有位为零的指针值不一定是空指针,但很可能不指向任何东西,所以将通过 calloc
分配的指针值与 anything[= 进行比较是不安全的72=]。在这种情况下,并且您的 Employee
结构没有任何非指针成员,calloc
的内存初始化不会给您带来任何有用的东西。
相反,您应该手动初始化每个哈希 table 元素:
void initHashtable(Hashtable *ht) {
ht->table = malloc(SIZE, sizeof(Employee));
for (int i = 0; i < SIZE; i++) {
ht->table[i].first_name = NULL;
ht->table[i].last_name = NULL;
}
}
完成后,您可以通过检查成员来检查 table 中的给定槽是否已分配:
if (ht->table[hashedKey].first_name != NULL || ht->table[hashedKey].last_name != NULL) // ...
因为空指针在布尔上下文中计算为 false 而非空指针(甚至无效指针)计算为 true,您可以将其缩写为
if (ht->table[hashedKey].first_name || ht->table[hashedKey].last_name) // ...
...如果你愿意的话。任一版本都告诉您已分配 table 元素。
我正在尝试使用以下代码编写一个非常简单的散列 table:
#include <stdio.h>
#include <string.h>
#define SIZE 10
typedef struct {
char *first_name;
char *last_name;
} Employee;
typedef struct {
Employee *table;
} Hashtable;
void initHashtable(Hashtable *ht) {
ht->table = (Employee *)calloc(SIZE, sizeof(Employee));
}
int hashKey(char *key) {
int length = strlen(key);
return length % SIZE;
}
void put(Hashtable *ht, Employee emp, char *key) {
int hashedKey = hashKey(key);
ht->table[hashedKey] = emp;
}
我可以通过以下方式插入元素:
int main(int argc, char const *argv[]) {
Employee e1;
e1.first_name = "John";
e1.last_name = "Doe";
Hashtable ht;
initHashtable(&ht);
put(&ht, e1, "Doe");
return 0;
}
但我想修改 "put" 函数,所以当我尝试插入内容时,它会检查该索引是否为空。如果为空则 return 一些消息,如果没有则插入该索引。类似于:
void put(Hashtable *ht, Employee emp, char *key) {
int hashedKey = hashKey(key);
if (ht->table[hashedKey] != 0) {
printf("Employee is in that index!\n");
} else {
ht->table[hashedKey] = emp;
}
}
但是这个 "if statement" 不起作用。所以,我尝试同时使用 0 和 NULL。然后我尝试像这样投射:
if(ht->table[hashedKey] != (Employee *)0)
和
if(ht->table[hashedKey] != (Employee)0)
没有任何效果。我的问题是我知道 calloc 初始化为 0,零。那么在结构的情况下,calloc 用什么初始化?
My question is I knew calloc initializes with 0, zero. Then in case of struct what do calloc initializes with?
calloc
完全不知道您将如何使用内存。它只是给你你要求的数量,所有位都设置为零。看看它的原型:
void * calloc(size_t num, size_t size)
参数num
和size
是只有的信息calloc
。
But this "if statement" is not working.
"not working",我想你的意思是 "does not compile"。
So, i tried with both 0 and NULL. Then I tried with casting like:
if(ht->table[hashedKey] != (Employee *)0)
and
if(ht->table[hashedKey] != (Employee)0)
Nothing is working.
您的编译器将发出诊断消息,解释为什么它拒绝您的代码。此类诊断有时可能很神秘,但肯定会因为对数据类型的抱怨而导致您问自己这个问题 "what are the types involved here?"。不过,我们可以提供帮助:
ht->table[hashedKey]
的类型为Employee
(一个结构,而不是指向一个结构的指针)。对于您的目的而言,这可能是最重要的一个,但让我们继续......0
是类型int
的常量,它也用作空指针常量(尽管它的类型)。(Employee *) 0
是类型为Employee *
的空指针。(Employee) 0
是无效表达式。它没有类型,因为将int
转换为Employee
. 等结构类型是无效的
Employee
等结构类型不是 !=
运算符(或 ==
运算符或大多数其他运算符)的有效操作数。这是你的主要问题。即使您生成了一个所有位都为零的 Employee
表示,这可以通过多种方式完成,您 仍然 无法直接比较它与 [=15 的(不)相等性=] 通过任何 C 的运算符。然而,即使结构 是 可比较的,将结构与任何类型的指针进行比较也没有意义,正如您的第一个示例试图做的那样。
My question is I knew calloc initializes with 0, zero. Then in case of struct what do calloc initializes with?
这似乎与您的问题没有任何关系,但既然您问了,calloc
初始化了它分配给所有位零的 space。对于整数类型(包括结构的成员),这是 0 的表示。对于其他类型,包括指针类型,语言没有指定此表示的含义。
要检查两个结构是否相等,您需要逐个比较它们。但是,在您的特定情况下,您实际上并不需要比较结构,您只需要检查 one 结构的成员。但是,因为所有位为零的指针值不一定是空指针,但很可能不指向任何东西,所以将通过 calloc
分配的指针值与 anything[= 进行比较是不安全的72=]。在这种情况下,并且您的 Employee
结构没有任何非指针成员,calloc
的内存初始化不会给您带来任何有用的东西。
相反,您应该手动初始化每个哈希 table 元素:
void initHashtable(Hashtable *ht) {
ht->table = malloc(SIZE, sizeof(Employee));
for (int i = 0; i < SIZE; i++) {
ht->table[i].first_name = NULL;
ht->table[i].last_name = NULL;
}
}
完成后,您可以通过检查成员来检查 table 中的给定槽是否已分配:
if (ht->table[hashedKey].first_name != NULL || ht->table[hashedKey].last_name != NULL) // ...
因为空指针在布尔上下文中计算为 false 而非空指针(甚至无效指针)计算为 true,您可以将其缩写为
if (ht->table[hashedKey].first_name || ht->table[hashedKey].last_name) // ...
...如果你愿意的话。任一版本都告诉您已分配 table 元素。