Bagaimana cara memanggil anggota suatu struct, yang telah diisi menggunakan fungsi penunjuk struct

Saya ingin tahu cara mencetak nilai char* worddari struktur ini.

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

Struktur ini telah diberi nilai pikir fungsinya

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;    
}

Saat saya menggunakan word_count_struct new_word_count( &word ); atau new_word_count( &word );untuk memanggil fungsi dan puts(new_word_count->word); untuk mencetak anggota dari main.c,

Saya mendapatkan pesan kesalahan

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

Dan

note: declared here
     struct word_count_struct *new_word_count;

Yang secara khusus saya tidak yakin adalah pemanggilan fungsi, saya tahu dengan fungsi lain saya biasanya menggunakan kode function_name(passing arguments); tetapi fungsi ini mengembalikan pointer struct dan sepertinya ada dua nama di dalam tanda tangan fungsi.

Jika saya tidak menggunakan fungsi untuk memberikan nilai ke anggota struct, saya dapat mencetak nilai new_word_count->word dalam main.c tidak ada masalah, jadi saya yakin masalah saya pasti berasal dari pemanggilan fungsi. Terima kasih sebelumnya.

Contoh Minimal, Lengkap dan dapat diverifikasi:

#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 sumber
comment
word_count_struct new_word_count( &word ); bukan kode C. Apakah Anda bermaksud menulis word_count_struct *mystruct = new_word_count( &word );. Harap tunjukkan contoh minimal yang dapat direproduksi, pertanyaan Anda agak tidak jelas.   -  person Jabberwocky    schedule 11.02.2018


Jawaban (1)


Anda mungkin menginginkan ini:

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

kode ini dikompilasi dan dijalankan tetapi kurang lebih tidak berguna karena fungsi new_word_count belum selesai.

Pertanyaan telah berubah...

Masalahnya sekarang ada di sini:

Anda membutuhkan ini:

new_word_count->word = word;

alih-alih

new_word_count->word = &word;

BTW kompiler Anda seharusnya memperingatkan Anda.

Fungsi lengkap:

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;
}

Namun dengan pendekatan ini kemungkinan besar Anda akan mengalami masalah lain karena Anda hanya menyimpan alamat kata yang akan dihitung, namun Anda mungkin lebih memilih untuk menyimpan kata itu sendiri. Alih-alih:

new_word_count->word = word;

Anda mungkin membutuhkan:

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
Saya telah mengubah dan mengubah kode saya dan menjalankannya, saya mendapatkan kesalahan segmentasi. dapatkah Anda menunjukkan kepada saya mengapa kode tersebut belum selesai? Saya pikir saya sudah menyelesaikan fungsinya, - person Tyler Green; 11.02.2018
comment
@TylerGreen 1. new_word_count tidak melakukan sesuatu yang berguna, terutama Anda tidak menggunakan wordparameter. Apa itu "Hello"2. Anda perlu menunjukkan contoh minimal yang dapat direproduksi, saya tidak dapat menebak kode apa yang sebenarnya Anda jalankan. Anda hanya menampilkan potongan kode dalam pertanyaan Anda dan seringkali masalah sebenarnya ada di tempat lain dalam kode. - person Jabberwocky; 11.02.2018
comment
saya telah menambahkan beberapa komentar pada contoh minimal untuk menjelaskan tujuan akhir dengan sebaik-baiknya - person Tyler Green; 11.02.2018
comment
@Michael Walz. Terima kasih atas bantuannya! Pertanyaan: Saya pikir ketika memanggil fungsi yang memerlukan pointer sebagai parameternya, fungsi tersebut harus menerima alamat memori sebagai argumen yang lewat. Dalam file ini saya telah menggunakan fungsi yang meneruskan penunjuk ganda dan &word berfungsi. mengapa &word tidak berfungsi dengan satu parameter penunjuk? - person Tyler Green; 11.02.2018
comment
@TylerGreen Saya pikir itu kandidat untuk pertanyaan lain. - person Jabberwocky; 11.02.2018