繁体   English   中英

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

[英]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()函数中,我得到了正确的结果。

我的输出来自<code> print_container </ code>

最初我的容器值是

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM