Написание функции для динамического выделения памяти в C - PullRequest
0 голосов
/ 06 февраля 2020

Проект, над которым я сейчас работаю, требует четырех динамически создаваемых массивов строк (каждая строка не длиннее 50 символов). Итак, я пытаюсь написать функцию, которая берет указатель на указатель и динамически выделяет память для этой переменной.

Это насколько я получил:

void makeArray(char*** arr[], int n) {
  int i;
  *arr = malloc(n*sizeof(char*));
  for (i = 0; i<n; i++) {
    *arr[i] = malloc(sizeof(char)*50);
  }
}

int main() {

  char** test;

  makeArray(&test,4);

  return 0;
}

Когда Я компилирую и запускаю, я получаю эту ошибку:

main.c:16:13: warning: passing argument 1 of ‘makeArray’ from incompatible pointer type [-Wincompatible-pointer-types]
   makeArray(&test,4);
             ^
main.c:4:6: note: expected ‘char ****’ but argument is of type ‘char ***’
 void makeArray(char*** arr[], int n) {

Когда я использую C Tutor, функция, кажется, успешно принимает мой массив test и выделяет слоты указателя 4. Затем он успешно выделяет 50 символов в слот 0 th test. Однако, когда l oop запускается снова, я получаю сообщение об ошибке. enter image description here

Я застрял на этом уже два дня, поэтому я приветствую любые предложения, которые могут быть у добрых пользователей переполнения стека!

Ответы [ 3 ]

3 голосов
/ 06 февраля 2020
#include <stdio.h>
#include <stdlib.h>

void makeArray(char*** arr, int n) {
  int i;
  *arr = calloc(n, sizeof (char*));
  for (i = 0; i<n; i++) 
  {
    (*arr)[i] = calloc(50, sizeof(char));
  }
}

int main() {

  char **test;

  makeArray(&test,4);

  return 0;
}

Должно быть то, что вы ищете. Как это работает:

  • Сначала я изменил ваш прототип на "char ***" на "char *** arr [] * как на самом деле char ****
  • Second * arr (разрешает запись в переменную test в main)
  • В-третьих, немного сложнее (* arr) написать в test и чем [] использовать test в качестве массива.

Я использую callo c вместо mallo c, поскольку он выглядит с моей точки зрения лучше, чем mallo c для массива, и это означает, что ваши строки инициализируются с 0 (с нулевым символом в конце)

1 голос
/ 06 февраля 2020

Здесь я взял решение от Schafwolle (очень мягкое и плавное прозвище!) И смешал свое прежнее решение и мою идею возвращения выделенного массива. Не забудьте освободить память в обратном порядке.

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

#define MAX_STRING_SIZE 50

char** makeArray(int n) {
  int i;
  char** arr = calloc(n, sizeof (char*));
  for (i = 0; i<n; i++) 
  {
    arr[i] = calloc(MAX_STRING_SIZE, sizeof(char));
  }
  return arr;
}

void recycleArray(char** arr, int n) {
  int i;
  for (i = 0; i<n; i++) 
  {
    free(arr[i]);
  }
  free(arr);
}

int main() {

  char** test = makeArray(4);
  strncpy(test[0],"Have ", MAX_STRING_SIZE-1);
  strncpy(test[1],"a ", MAX_STRING_SIZE-1);
  strncpy(test[2],"nice ", MAX_STRING_SIZE-1);
  strncpy(test[3],"evening.", MAX_STRING_SIZE-1);
  printf("%s%s%s%s\n", test[0], test[1], test[2], test[3]);
  recycleArray(test, 4);
  return 0;
}
0 голосов
/ 06 февраля 2020

Просто начните с этого:

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

#define MAX_STRING_SIZE 50

void makeArray(char* arr[], int n) {
  int i;
  for (i = 0; i<n; i++) {
    arr[i] = malloc(sizeof(char)*MAX_STRING_SIZE);
  }
}

int main() {

  char* test[4];
  makeArray(test,4);

  strncpy(test[0],"Have ", MAX_STRING_SIZE-1);
  strncpy(test[1],"a ", MAX_STRING_SIZE-1);
  strncpy(test[2],"nice ", MAX_STRING_SIZE-1);
  strncpy(test[3],"evening.", MAX_STRING_SIZE-1);
  printf("%s%s%s%s\n", test[0], test[1], test[2], test[3]);

  return 0;
}

Если вы также хотите динамически создавать массив указателей, просто верните указатель вместо void. Это делает его более читабельным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...