【问题标题】:How do I correctly assign and print structure pointers in c?如何在 c 中正确分配和打印结构指针?
【发布时间】:2018-07-22 04:00:18
【问题描述】:

我有以下两种结构。

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;

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

【问题讨论】:

  • 试试counter_ptr-&gt;string = string; --> counter_ptr-&gt;string = strdup(string);
  • 那些是你得到的一些很酷的角色......
  • counter_ptr-&gt;string = string; 更改为 counter_ptr-&gt;string = strdup(string); 会给我一个分段错误。我还尝试将其更改为strcpy(counter_ptr-&gt;string, string);,这也给了我一个分段错误。
  • 我认为你混淆了 new_struct 中 struct counter 与 struct string_container 的返回,以及 sizeof 名称。你能打开更多的编译器警告来捕捉这些问题吗?我认为这是最重要的。
  • 抱歉,我发布的代码不是我正在运行的确切代码,我从笔记本电脑在我的桌面上重写了它,我修复了sizeof() 问题,但输出仍然存在。但是我注意到最后两个输出 7 和 8 始终具有相同的输出,而其他 7 似乎每次都在变化。

标签: c function pointers struct malloc


【解决方案1】:

主要问题可能是您的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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多