Как мне вызвать член структуры, которая была заполнена с помощью функции указателя структуры

Я хотел бы знать, как распечатать значение char* wordиз этой структуры.

  struct word_count_struct {
  char *word;
  int   count;
};

Этой структуре было присвоено значение, поскольку функция

struct word_count_struct *new_word_count( char *word )
{
    struct word_count_struct *new_word_count = (struct word_count_struct *)malloc(sizeof(struct word_count_struct));

    new_word_count->word = "Hello";
    new_word_count->count = 1; 

    return new_word_count;    
}

Когда я использую word_count_struct new_word_count( &word ); или new_word_count( &word ); для вызова функции и puts(new_word_count->word); для вывода члена из main.c,

я получаю сообщение об ошибке

error: called object ‘new_word_count’ is not a function or function pointer

а также

note: declared here
     struct word_count_struct *new_word_count;

В чем я конкретно не уверен, так это в вызове функции, я знаю, что с любой другой функцией я бы обычно использовал код function_name(passing arguments);, но эта функция возвращает указатель структуры, и, похоже, в сигнатуре функции есть два имени.

Если я не использую функцию для присвоения значения членам структуры, я могу распечатать значение new_word_count->word в main.c без проблем, поэтому я считаю, что мои проблемы должны исходить из вызова функции. Заранее спасибо.

Минимальный, полный и проверяемый пример:

#include <stdio.h>
#include <stdlib.h>

struct word_count_struct {
  char *word;
  int count;
};

struct word_count_struct *new_word_count( char *word );

int main()
{
    struct word_count_struct *wordcountptr;
    char *word = "Hello";

    wordcountptr = new_word_count(word);
    puts(wordcountptr->word); /* print out the string "Hello" which was assigned to this struct member though the word_count_struct function */
    free(wordcountptr);
    return 0;
}

/* this function should take the value of the passing argument and assign it to the word member of struct word_count_struct and then return a pointer to that struct */
struct word_count_struct *new_word_count( char *word )
{
    struct word_count_struct *new_word_count;
    new_word_count = (struct word_count_struct *)malloc(sizeof(struct word_count_struct)); /* allocate memory for struct */

    new_word_count->word = &word; /* assign the memory address of passing argument to this member */
    new_word_count->count = 1;

    return new_word_count;

}

person Tyler Green    schedule 11.02.2018    source источник
comment
word_count_struct new_word_count( &word ); не является кодом C. Вы намеревались написать word_count_struct *mystruct = new_word_count( &word );. Пожалуйста, покажите минимально воспроизводимый пример, ваш вопрос несколько неясен.   -  person Jabberwocky    schedule 11.02.2018


Ответы (1)


Вы, вероятно, хотите этого:

struct word_count_struct *wordcountptr;
char *word;
wordcountptr = new_word_count(word);
puts(wordcountptr->word);

этот код компилируется и запускается, но он более или менее бесполезен, потому что функция new_word_count не завершена.

Вопрос изменен...

Проблема теперь здесь:

Ты нуждаешься в этом:

new_word_count->word = word;

вместо

new_word_count->word = &word;

Кстати, ваш компилятор должен был вас предупредить.

Полная функция:

struct word_count_struct *new_word_count(char *word)
{
  struct word_count_struct *new_word_count;
  new_word_count = (struct word_count_struct *)malloc(sizeof(struct word_count_struct));

  new_word_count->word = word;
  new_word_count->count = 1;

  return new_word_count;
}

Но при таком подходе вы, скорее всего, столкнетесь с другими проблемами, потому что вы сохраняете только адрес подсчитываемого слова, а скорее хотите сохранить само слово. Вместо:

new_word_count->word = word;

вам, вероятно, нужно:

new_word_count->word = malloc(strlen(word) + 1);  // allocate memory for word
strcpy(new_word_count->word, word);               // copy the word
person Jabberwocky    schedule 11.02.2018
comment
Я изменил и изменил свой код и запустил его, я получаю ошибку сегментации. можете ли вы указать мне, почему код незакончен? Я думал, что функция завершена, - person Tyler Green; 11.02.2018
comment
@TylerGreen 1. new_word_count не делает ничего полезного, особенно вы не используете параметр word. Что такое "Hello"2. Вам нужно показать минимально воспроизводимый пример, я не могу угадать, какой именно код вы запускаете. Вы показываете только фрагменты кода в своем вопросе, и очень часто фактическая проблема находится в другом месте кода. - person Jabberwocky; 11.02.2018
comment
я добавил несколько комментариев к минимальному примеру, чтобы лучше объяснить конечную цель - person Tyler Green; 11.02.2018
comment
@ Майкл Вальц. Спасибо вам за помощь! Вопрос: Я думал, что при вызове функции, требующей в качестве параметров указатель, функция должна получить в качестве передаваемого аргумента адрес памяти. В этом файле я использовал функцию, которая передает двойной указатель, и &word сработало. почему &word не работает с одним параметром указателя? - person Tyler Green; 11.02.2018
comment
@TylerGreen Я думаю, что это кандидат на другой вопрос. - person Jabberwocky; 11.02.2018