Masalah saya adalah program saya hanya mendaftarkan kata terakhir di cad[]:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 4

void main()
{
  char *cad[N];

  for(int i=0;i<N;i++)
  {
      char word[100];
      printf("Escribe algo : ");
      scanf("%s",word);
      cad[i] = (char*)malloc((strlen(word)+1)*sizeof(char));
      cad[i] = word;

  }

  for (int i = 0; i < N; i++)
      printf("%s\n",cad[i]); //just print the last word registered
}

Misalnya, idenya adalah jika cad[1] = "Hello", ...cad[n] = "Yea", semua kata terdaftar di bidangnya masing-masing, tetapi ketika saya printf semua cad dari 0 ke n-1 semua cad[i] hanya mencatat kata terakhir yaitu "yea".

Apa masalahnya dan bagaimana saya bisa menyelesaikannya?

-1
mefesto pat 16 Juni 2020, 18:09

2 jawaban

Variabel word dialokasikan pada stack dan dioptimalkan untuk digunakan kembali di setiap loop for yang membaca kata-kata.

Karena itu, Anda menimpa alamat memori yang dialokasikan dengan alamat word, jadi Anda hanya membuang memori yang dialokasikan. Jadi setiap elemen di cad akan menunjuk ke alamat word, yang akan menampung kata yang terakhir dibaca.

Yang perlu Anda lakukan adalah menyalin isi kata di ruang yang dialokasikan dengan menggunakan fungsi strcpy:

    strcpy(cad[i], word);

Juga, praktik yang baik adalah free memori malloc Anda setelah selesai menggunakannya:

    for (int i = 0; i < N; i++)
    {
        free(cad[i]);
    }
1
Vlad Rusu 16 Juni 2020, 15:17

Masalahnya adalah Anda menetapkan cad[i] = word, alih-alih menyalin kata ke dalam memori yang Anda alokasikan dalam instruksi sebelumnya.

Coba lakukan penyesuaian berikut.

void main()
{
  char *cad[N];

  for (int i=0; i<N; i++)
  {
    char word[100];
    printf("Escribe algo : ");
    scanf("%s",word);
    cad[i] = (char*) malloc((strlen(word)+1)*sizeof(char));
    strcpy(cad[i], word); // Copy word into cad[i]
  }

  for (int i = 0; i < N; i++)
  {
    printf("%s\n",cad[i]);
    free(cad[i]); // Also free allocated memory
  }
}
0
AJ Ferron 16 Juni 2020, 15:21