簡體   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