Почему я не могу оценить "массив в NULL" в цикле for? - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь подсчитать элементы массивов массива для выделения памяти "res", используемой для конкатенации, включая терминаторы NULL, каждую строку, хранящуюся в "argv".Вероятно, есть еще ошибки, но первое, что я не понимаю, это argv[a][b] != NULL в /* length of arrays */.Почему это неприемлемо и существуют ли другие способы - без жесткого кодирования - или передачи длины - для определения количества элементов?

используется: http://pythontutor.com/c.html#mode=edit

char    *ft_concat_params (int argc, char **argv)
{
    int len_argc = argc - 1,
        len_argv = 0;
    char *res = NULL;

    /* length of argvs */
    for (int a = 0; a < len_argc; a++) {
      for (int b = 0;argv[a][b] != NULL; b++) {
        len_argv++;
      }
    }

    /* allocate memory res -- freed by calling function! */
    res = malloc (len_argv * sizeof * res);
    if (!res) {
      ft_putstr ("not allocated res");
      free(res);
      return NULL;
    }

    /* concate strings */
    for (int a = 0; a < len_argc; a++) {
      int b = 0;
      while (argv[a][b] != '\0') {
        res = &argv[a][b];
        b++;
      }
      res[b] = '\0';
    }

    return res;
}

int   main(void)
{
  int argc = 4;
  char argv[3][6] = {
    {'s','t','a','r','t','\0'},
    {'s','t','a','r','t','\0'},
    {'s','t','a','r','t','\0'}
  };
  char *arr;

  arr = ft_concat_params (argc, argv);
  if (!arr)       /* validate return */
      return 1;

  free(arr);
}

Ответы [ 3 ]

6 голосов
/ 06 марта 2019

Эта строка:

char *res = 'NULL'; 

НЕ инициализирует указатель на NULL.Скорее, он устанавливает какое-то странное, бессмысленное 32-битное значение.

Вы хотите начать с

char *res = NULL;  // NOTE:  No single-quotes around it.
1 голос
/ 06 марта 2019
the first I don't understand is argv[a][b] != NULL
  • argv имеет тип (char **)
  • argv [a] имеет тип (char *)
  • argv [a] [b] имеет тип (символ)

Сравнение argv [a] [b] с NULL сравнивает символ с указателем, что недопустимо, потому что это не имеет смысла.

0 голосов
/ 06 марта 2019

Основная проблема в том, что 2D-массив не имеет ничего общего с char**. Указатель на указатель не может указывать на двумерный массив. Это не 2D массив. Он не совместим с 2D-массивом. Забудьте про указатели на указатели.

За исключением , когда у вас есть одномерный массив указателей - тогда указатель-указатель может использоваться для указания на первый элемент этого массива. Так что если бы ваш код в main () был char* argv[n] = { "hello", "world", ... }, то ваша функция с char** сработала бы.

Но это не так. У вас есть истинный 2D-массив в main (). Таким образом, вы должны изменить функцию соответственно:

char* ft_concat_params (int x, int y, char argv[x][y])
{
  ...
  argv[i][j]  // now you can use this way of accessing
...