gpt4 book ai didi

c - 如何在c中正确分配和打印结构指针?

转载 作者:行者123 更新时间:2023-11-30 16:35:48 25 4
gpt4 key购买 nike

我有以下两个结构。

struct string_counter {
char *string;
int count;
};


struct container{
struct string_counter *counters;
int size;
};

以及以下功能。

void add_string(struct *container, char *string){
struct string_counter *counter_ptr;
counter_ptr = new_count(string);

container->size++;
container->counters = realloc(container->counters, sizeof(struct string_counter)*container->size);
container->counters[container->size-1] = *counter_ptr;
print_string_counter(&container->counters[container->size-1]);
}

struct counter *new_count(char *string){
struct string_counter *counter_ptr;

counter_ptr = malloc(sizeof(struct string_counter));
counter_ptr->string = string;
counter_ptr->count = 1;

return counter_ptr;
}

在我的主函数中,我每次使用相同的容器指针和不同的字符串循环多次调用add_string(container_ptr, string),尝试将新字符串添加到string_counter *计数器。稍后在我的代码中,当我尝试使用以下两个函数打印计数器的内容时​​:

void print_container(struct container *container_ptr){
int i;
for(i = 0; i < container_ptr->size; i++){
print_string_counter(&container_ptr->counters[i]);
}
}

void print_string_counter(struct string_counter *counter_ptr){
printf("%s : %d\n", counter_ptr->string, counter_ptr->count);
}

我得到了极其错误的结果,例如下面的输出。但早些时候当我打印时:

print_string_counter(&container->counters[container->size-1])

就在下面:

container->counters[container->size-1] = *counter_ptr;

在我的 add_string() 函数中,我得到了正确的结果。

My output from <code>print_container</code>

最初我的容器值为

struct_counter = NULL;
int size = 0;

为什么我稍后使用循环的输出与最初打印时不同?

最佳答案

主要问题可能是您的 string_counter 结构实际上并不存储字符串 - 它只是存储指针,该指针将指向您传入的任何内容。在 new_count,如果您传入的字符串位于临时缓冲区中(例如您用来读取 main 中的输入的缓冲区),那么当该缓冲区消失时,string_counter 中的指针code> 将悬空,当您稍后打印时,您将得到原始缓冲区所在内存中的任何垃圾。

相关(但独立)的 container 结构维护一个 string_counter 对象数组,而不是指针,因此当您调用 add_string 时,它会扩展该数组并调用 new_count 来分配新的 string_counter。然后它复制新分配的对象并泄漏它。

因此,您可能还需要在 new_counter 中复制字符串。您还可以通过让 new_count 返回一个对象而不是指针来解决第二个问题:

struct counter new_count(char *string){
struct string_counter counter;

counter.string = strdup(string);
counter.count = 1;

return counter;
}

关于c - 如何在c中正确分配和打印结构指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48738747/

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