gpt4 book ai didi

C - 将指针传递给函数,然后将函数内部的相同指针传递给另一个函数

转载 作者:太空宇宙 更新时间:2023-11-04 05:30:44 24 4
gpt4 key购买 nike

哇!长标题...这里有一些伪代码来解释这个措辞:

int main(){
int* ptr = function1(); //the data that ptr points to is correct here
function2(ptr);
}

int function2(int* ptr){
//the data that ptr points to is still correct
int i;
for(i=0;i<length;printf("%d\n", (*ptr)[i]), i++); //since ptr points to a contiguous block of memory
function3(ptr);
}

int function3(int* ptr){
//the data that ptr points to is INCORRECT!!!
}

为什么function3中的数据会不正确?

注意:function1 执行 malloc() 并返回指向该内存的指针。

实际代码

#include <stdlib.h>
#include <stdio.h>

//Structures
struct hash_table_data_
{
int key, data;
struct hash_table_data_ *next, *prev;
};

struct hash_table_
{
int num_entries;
struct hash_table_data_ **entries;
};

typedef struct hash_table_data_ hash_table_data;
typedef struct hash_table_ hash_table;

//Prototypes
hash_table *new_hash_table(int num_entries);
int hash_table_add(hash_table *ht, int key, int data);
int hash_table_loader(hash_table* ht);

//Main
int main()
{
int num_entries = 8;//THIS MUST BE AUTOMATED

hash_table* ht = new_hash_table(num_entries);
hash_table_loader(ht);

return 0;
}

//Function Definitions
hash_table *new_hash_table(int num_entries)
{
hash_table* ht = (hash_table*) malloc(sizeof(hash_table));

hash_table_data* array = malloc(num_entries * sizeof(hash_table_data));
int i;
for (i=0;i<num_entries;i++)
{
array[i].key = -1;
array[i].data = -1;
array[i].next = NULL;
array[i].prev = NULL;
}

ht->entries = &array;
ht->num_entries = num_entries;

return ht;
}

int hash_table_add(hash_table *ht, int key, int data)
{
//VERIFY THAT THE VALUE ISN'T ALREADY IN THE TABLE!!!!!!!!!!!
int num_entries = ht->num_entries;
hash_table_data* array = *(ht->entries); //array elements are the LL base
int hash_val = key%num_entries;

printf("adding an element now...\n");
printf("current key: %d\n", array[hash_val].key);

int i;
for(i=0;i<num_entries;printf("%d\n", (*(ht->entries))[i].key),i++);//DATA IS INCORRECT!!!!

if (array[hash_val].key == -1)//is this the base link?
{
printf("added a new base link!\n");
array[hash_val].key = key;
array[hash_val].data = data;
array[hash_val].next = NULL;
array[hash_val].prev = &(array[hash_val]);
}
else//since it's not the base link...do stuff
{
hash_table_data* new_link = malloc(sizeof(hash_table_data));
new_link->key = key;//set the key value
new_link->data = data;//set the data value
if (array[hash_val].next == NULL)//we must have the second link
{
printf("added a new second link!\n");
new_link->prev = &(array[hash_val]); //set the new link's previous to be the base link
array[hash_val].next = new_link; //set the first link's next
}
else//we have the 3rd or greater link
{
printf("added a new 3rd or greater link!\n");
hash_table_data next_link_val = *(array[hash_val].next);
while (next_link_val.next != NULL)//follow the links until we reach the last link
{
next_link_val = *(next_link_val.next);//follow the current link to the next
}
//now that we've reached the last link, link it to the new_link
next_link_val.next = new_link; //link the last link to the new link
new_link->prev = &(next_link_val); //link the new link to the last link
}
}

return 0;
}

int hash_table_loader(hash_table* ht)
{
int i;
for(i=0;i<(ht->num_entries);printf("%d\n", (*(ht->entries))[i].key),i++); //DATA IS STILL CORRECT HERE

FILE *infile;
infile = fopen("input.txt", "r");
while(!feof(infile))
{
int key,data;
fscanf(infile, "%d %d", &key, &data);
hash_table_add(ht, key, data);
}
fclose(infile);
}

注意:第一次调用 hash_table_add() 时出现问题。

最佳答案

你的第一个问题在这里:

ht->entries = &array;

您使该结构保存一个hash_table_data**,它指向函数的局部变量hash_table_data* array;然后退出函数并返回指向结构的指针。该结构仍然存在(它是通过 malloc() 分配的,并且 array 指向的东西仍然存在,但 array 本身不存在。因此,结构中的 this 指针现在无效。

据我所知,你没有理由在这里持有一个指针到指针。只需使用 hash_table_data* 作为条目类型,并将 array 复制到该结构成员中。指针也是值。

关于C - 将指针传递给函数,然后将函数内部的相同指针传递给另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6839381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com