[英]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.