返回 main class 后未看到相同的整数值
Not seeing same value of integer upon returning to main class
我正在为散列 table 实现编写一些框架代码。在主要 class 中,有一部分检查 table 中的密钥。它允许重复,因此它期望 return 指定大小的数组,如果条目超过该大小,则使用更大的数组再次调用它。我的问题是之前声明的 "num_results" 指针。
int num_values = 1;
valType* values = malloc(1 * sizeof(valType));
int* num_results = NULL;
get(ht, key, values, num_values, num_results);
printf("num_results: %d\n", (*num_results));
if ((*num_results) > num_values) {
values = realloc(values, (*num_results) * sizeof(valType));
get(ht, 0, values, num_values, num_results);
}
for (int i = 0; i < (*num_results); i++) {
printf("value of %d is %d \n", i, values[i]);
}
free(values);
它被声明为空(大概是因为如果没有结果那么内存就不会浪费?)
int get(hashtable* ht, keyType key, valType *values, int num_values, int* num_results) {
int slot = key % sizeof(ht);
struct node *entry = ht->entries[slot];
if(entry == NULL){
printf("There are no matching hashed keys");
return -1;
}
// Allocate the num_results, as just a NULL pointer was passed
if((num_results = malloc(sizeof(int))) == NULL){
return -1;
}
// Start it at 0 so that it cxan be incremented as we check
(*num_results) = 0;
printf("num_results: %d\n", (*num_results));
int temp = num_values;
while(entry != NULL){
if(entry->key == key){
++(*num_results);
if(temp != 0){
values[num_values-temp] = entry->value;
--temp;
}
}
entry = entry->next;
}
printf("num_results: %d\n", (*num_results));
return 0;
}
这是 get 函数,如您所见,我分配了所需的内存,将其设置为 0,然后按预期递增。输出如下:
num_results: 0
num_results: 2
num_results: 73896
这让我很困惑,因为 2 结果显然来自该方法的最后一行,并且最后的打印输出紧接在 returning 到 main 之后...这里发生了什么?为什么值会发生变化?
您必须通过引用传递指针 num_results
。否则该函数处理指针的副本。
例如
int get(hashtable* ht, keyType key, valType *values, int num_values, int ** num_results) {
// ...
if(( *num_results = malloc(sizeof(int))) == NULL){
return -1;
}
//…
函数调用看起来像
get(ht, key, values, num_values, &num_results);
实际上,我认为将变量 num_results
声明为指针并在函数中为其动态分配内存没有什么意义。我至少会声明它具有 unsigned int
.
类型
例如
unsigned int num_results = 0;
然后函数 get 可能看起来像
int get(hashtable* ht, keyType key, valType *values, int num_values, unsigned int *num_results) {
//…
*num_results = 0;
//…
并称赞
get(ht, key, values, num_values, &num_results);
注意那个而不是
int slot = key % sizeof(ht);
你的意思好像是
int slot = key % sizeof( *ht);
我正在为散列 table 实现编写一些框架代码。在主要 class 中,有一部分检查 table 中的密钥。它允许重复,因此它期望 return 指定大小的数组,如果条目超过该大小,则使用更大的数组再次调用它。我的问题是之前声明的 "num_results" 指针。
int num_values = 1;
valType* values = malloc(1 * sizeof(valType));
int* num_results = NULL;
get(ht, key, values, num_values, num_results);
printf("num_results: %d\n", (*num_results));
if ((*num_results) > num_values) {
values = realloc(values, (*num_results) * sizeof(valType));
get(ht, 0, values, num_values, num_results);
}
for (int i = 0; i < (*num_results); i++) {
printf("value of %d is %d \n", i, values[i]);
}
free(values);
它被声明为空(大概是因为如果没有结果那么内存就不会浪费?)
int get(hashtable* ht, keyType key, valType *values, int num_values, int* num_results) {
int slot = key % sizeof(ht);
struct node *entry = ht->entries[slot];
if(entry == NULL){
printf("There are no matching hashed keys");
return -1;
}
// Allocate the num_results, as just a NULL pointer was passed
if((num_results = malloc(sizeof(int))) == NULL){
return -1;
}
// Start it at 0 so that it cxan be incremented as we check
(*num_results) = 0;
printf("num_results: %d\n", (*num_results));
int temp = num_values;
while(entry != NULL){
if(entry->key == key){
++(*num_results);
if(temp != 0){
values[num_values-temp] = entry->value;
--temp;
}
}
entry = entry->next;
}
printf("num_results: %d\n", (*num_results));
return 0;
}
这是 get 函数,如您所见,我分配了所需的内存,将其设置为 0,然后按预期递增。输出如下:
num_results: 0
num_results: 2
num_results: 73896
这让我很困惑,因为 2 结果显然来自该方法的最后一行,并且最后的打印输出紧接在 returning 到 main 之后...这里发生了什么?为什么值会发生变化?
您必须通过引用传递指针 num_results
。否则该函数处理指针的副本。
例如
int get(hashtable* ht, keyType key, valType *values, int num_values, int ** num_results) {
// ...
if(( *num_results = malloc(sizeof(int))) == NULL){
return -1;
}
//…
函数调用看起来像
get(ht, key, values, num_values, &num_results);
实际上,我认为将变量 num_results
声明为指针并在函数中为其动态分配内存没有什么意义。我至少会声明它具有 unsigned int
.
例如
unsigned int num_results = 0;
然后函数 get 可能看起来像
int get(hashtable* ht, keyType key, valType *values, int num_values, unsigned int *num_results) {
//…
*num_results = 0;
//…
并称赞
get(ht, key, values, num_values, &num_results);
注意那个而不是
int slot = key % sizeof(ht);
你的意思好像是
int slot = key % sizeof( *ht);