[英]How do I correctly assign and print structure pointers in c?
我有以下两个结构。
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 *counters
的末尾。 稍后在我的代码中,当我尝试使用以下两个功能打印计数器的内容时:
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()
函数中,我得到了正确的结果。
最初我的容器值是
struct_counter = NULL;
int size = 0;
为什么以后使用循环的输出与打印时的原始输出不同?
主要问题可能是您的string_counter
结构实际上并没有存储字符串-它仅存储指针,该指针将指向您传递的内容。在new_count
,如果您传递的字符串位于临时缓冲区中(例如缓冲区您可以在main
)中读取输入,然后当该缓冲区消失时, string_counter
的指针将悬空,并且当您以后进行打印时,您将得到原始缓冲区所在的内存中发生的任何垃圾。
相关(但独立)的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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.