Нужна помощь с объявлениями в C - PullRequest
0 голосов
/ 02 декабря 2009

Как мне сделать следующую декларацию?

int main(int argc, char *argv[]) {
char *users[] = {};
char *names[] = {};

openPasswd(users, names);

return 0;
}

void openPasswd(char &users[] = {}, char &names[] = {}){
}

Я хочу заполнить 2 char arrays из функции обратно в основную программу.

Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2009

Вам нужно использовать указатели на указатели на указатели:

void openPasswd(char ***users, char ***names)
{
  *users = malloc(3 * sizeof **users);
  (*users)[0] = "3";
  (*users)[1] = "4";
  (*users)[2] = "7";
  *names = malloc(3 * sizeof **names);
  (*names)[0] = "foo";
  (*names)[1] = "bar";
  (*names)[2] = "baz";
}

int main(void)
{
  char **users, **names;

  openPasswd(&users, &names);
  print("user %s is named %s\n", users[0], names[0]);
  return 0;
}

Обратите внимание, что в приведенном выше примере проверка ошибок отсутствует, и предполагается, что данные известны во время компиляции.

1 голос
/ 02 декабря 2009

Если вы не знаете, насколько большие массивы будут опережать время:

int main(int argc, char **argv) 
{
  char **users = NULL; // users and names will be dynamically allocated arrays
  char **names = NULL; // of pointer to char
  size_t entries = 0;
  /**
   * Somewhere between here and openPassword figure out how big the arrays
   * need to be
   */
  openPasswd(&users, &names, entries);
  return 0;
}
/**
 * Since we need to modify the values of the pointers for users and names,
 * we must pass pointers to those pointers.
 */
void openPasswd(char ***users, char ***names, size_t entries)
{
  size_t i;

  /**
   * allocate the arrays
   *
   * type of  *users == char **
   * type of **users == char *
   */
  *users = malloc(sizeof **users * entries);
  *names = malloc(sizeof **names * entries);
  /**
   * Allocate each entry and get the username/password data from somewhere
   * get_user_length, get_name_length, get_user, get_name are all
   * placeholders.  
   */
  for (i = 0; i < entries; i++)
  {
    /**
     * The subscript operator should not applied to the values of users and 
     * names, but to the values of what users and names *point to*.  Since 
     * [] binds before *, we must use parens to force the correct grouping.  
     *
     * type of  (*users)[i] == char *
     * type of *(*users)[i] == char
     */
    (*users)[i] = malloc(sizeof *(*users)[i] * get_user_length(i));
    if ((*users)[i] != NULL)
    {
      strcpy((*users)[i], get_user(i));
    }
    (*names)[i] = malloc(sizeof *(*names)[i] * get_name_length(i));
    if ((*names)[i] != NULL)
    {
      strcpy((*names)[i], get_name(i));
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...