Функция печати списка слов - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь понять, что здесь не так.

void longestConsec(char* strarr[], int n) {
  for(int i=0; i<n; i++)
  {
    printf("%s\n",strarr[i]);
  }
}

int main()
{
    char string[8][14] = {"zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"};
    longestConsec(string, 8);
    return 0;
}

Я хочу напечатать каждое слово, но по какой-то причине это не работает. Я думаю, что strarr - это массив указателя на char, поэтому в каждой ячейке должно быть слово, верно? Но когда я попытался отладить код, я увидел, что strarr и strarr [0] имеют разные места в памяти. Почему?

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Ваш компилятор должен был дать вам предупреждение, которое дает хорошую подсказку.

k.c:12:19: warning: passing argument 1 of ‘longestConsec’ from incompatible pointer type [-Wincompatible-pointer-types]
   12 |     longestConsec(string, 8);
      |                   ^~~~~~
      |                   |
      |                   char (*)[14]
k.c:2:26: note: expected ‘char **’ but argument is of type ‘char (*)[14]’
    2 | void longestConsec(char* strarr[], int n) {
      |                    ~~~~~~^~~~~~~~

string - это массив массивов, char[8][14] и strarr - указатель на указатель на char, char **. Когда string передается функции, она распадается до указателя на массив из 14 символов, char (*)[14]. Передача многомерных массивов функциям может быть сложной, но это работает:

// size_t is better than int in this case
void longestConsec(size_t len, char strarr[][len], size_t n) 
{
    for(int i=0; i<n; i++)
        printf("%s\n",strarr[i]);
}

И затем вызовите его с помощью:

longestConsec(sizeof string[0]/sizeof string[0][0], // 14
              string, 
              sizeof string/sizeof string[0]        // 8
              );

Обратите внимание, что вы можете написать sizeof string[0] вместо sizeof string[0]/sizeof string[0][0] но это потому, что sizeof char всегда равно 1.

Понимание этих объявлений может быть немного сложным. Просто чтобы дать типовой пример того, как они объявлены:

char (*arr)[10]; // arr is a pointer to array of char of size 10
char *arr[10];   // arr is an array of 10 pointers to char

Связано: массивы не являются указателями, а указатели не являются массивами

1 голос
/ 01 августа 2020

strarr - это массив указателей на char, но string не является массивом указателей, а массивом из 14-элементного массива символов.

Указатели и 14-элементный массив символов могут имеют другой размер, поэтому ваш код не будет работать.

Как насчет использования массива указателей, подобного этому?

#include <stdio.h>

void longestConsec(const char* strarr[], int n) {
  for(int i=0; i<n; i++)
  {
    printf("%s\n",strarr[i]);
  }
}

int main()
{
    const char* string[8] = {"zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"};
    longestConsec(string, 8);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...