为什么不能在for循环中评估“数组为NULL”?

时间:2019-03-06 14:47:18

标签: c for-loop multidimensional-array

我试图计算数组数组的元素,以分配用于存储“ argv”中每个字符串的内存“ res”(包括NULL终止符)。可能会发现更多错误,但是我不了解的第一个错误是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 个答案:

答案 0 :(得分:6)

此行:

char *res = 'NULL'; 

不将指针初始化为NULL。 而是将其设置为一些奇怪的,毫无意义的32位值。

您想开始

char *res = NULL;  // NOTE:  No single-quotes around it.

答案 1 :(得分:1)

the first I don't understand is argv[a][b] != NULL
  • argv的类型为(char **)
  • argv [a]的类型为(char *)
  • argv [a] [b]的类型为(char)

将argv [a] [b]与NULL比较会将一个char与一个指针进行比较,这是不允许的,因为它没有意义。

答案 2 :(得分:0)

主要问题是2D数组与char**没有关系。指向指针的指针不能指向2D数组。它不是二维数组。它与2D阵列不兼容。忘记指针的指针。

(如果您拥有一维指针数组),则可以使用指针指向指针指向该数组的第一个元素。因此,如果您main()中的代码为char* argv[n] = { "hello", "world", ... },那么您使用char**的函数就可以使用。

但是不是。您在main()中拥有一个真正的2D数组。因此,您必须相应地更改功能:

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