проблемы с динамическим выделением памяти для char * [] - PullRequest
0 голосов
/ 16 июня 2020

Моя проблема в том, что моя программа регистрирует только последнее слово в 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
}

Например, идея состоит в том, если cad[1] = "Hello", ...cad[n] = "Yea", все слова зарегистрированы в соответствующих полях, но когда я printf все cad от 0 до n-1 все cad[i] просто записываю последнее слово, которое равно "yea".

В чем проблема и как ее решить ?

1 Ответ

1 голос
/ 16 июня 2020

Переменная word размещена в стеке и оптимизирована для повторного использования в каждом l oop из того, что читает слова.

Сказав это, вы перезаписываете выделенный адрес памяти с помощью адрес word, поэтому вы просто отбрасываете выделенную память. Таким образом, каждый элемент в cad будет указывать на адрес word, который будет содержать последнее прочитанное слово.

Что вам нужно сделать, так это скопировать содержимое слова в выделенное пространство, используя strcpy функция:

    strcpy(cad[i], word);

Также рекомендуется free ваша память mallo c 'd после ее использования:

    for (int i = 0; i < N; i++)
    {
        free(cad[i]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...