Что означает ошибка компилятора "error: expected declaration or statement at end of input" и каковы возможные причины ее появления?

Какова причина ошибки компиляции, которую я получаю при выполнении функции `print_arr` в моём коде, в частности, сообщения об ошибке "expected declaration or statement at end of input"? Я предполагаю, что ошибка может быть связана с недостатком точек с запятой, но я проверил и их достаточно. Пожалуйста, укажите, в чём конкретно эта ошибка. Не обращайте внимания на необходимость освобождения памяти, я планировал сделать это после первой проверки, и уверен, что без этой реализации код всё равно должен работать. Вот мой код: 

<pre><code class="cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int** get_array_of_arrays(unsigned int a){
    int** arr_arr = calloc(a, sizeof(int*));
    for (size_t i = 0; i &lt; a; ++a){
        int b;
        scanf("%d", &amp;b);
        arr_arr[i] = calloc(b, sizeof(int));
    }
    return arr_arr;
}

void fill_array(int** arr_arr){
    unsigned int len = sizeof(arr_arr)/sizeof(int*);
    for (size_t i = 0; i &lt; len; ++i){
        unsigned int len_2 = sizeof(arr_arr[i])/sizeof(int);
        for (size_t j = 0; j &lt; len_2; ++j){
            int filler;
            scanf("%d", &amp;filler);
            arr_arr[i][j] = filler;
        }
    }
}

void print_arr(int** arr_arr){
    unsigned int len = sizeof(arr_arr)/sizeof(int*);
    for (size_t i = 0; i &lt; len; ++i){
        unsigned int len_2 = sizeof(arr_arr[i])/sizeof(int);
        for (size_t j = 0; j &lt; len_2; ++j){
            printf("%d\n", arr_arr[i][j]);
        }
}

int main(){
	int n;
	scanf("%d", &amp;n);
	int** array_of_arrays = get_array_of_arrays(n);
</code></pre>
  • 11 ноября 2024 г. 20:13
Ответы на вопрос 2
Ошибка компилятора "expected declaration or statement at end of input" обычно указывает на то, что компилятор достиг конца файла, но ожидал завершения некоторого блока кода, такого как функция, структура или условный оператор. Это часто происходит из-за отсутствия закрывающей фигурной скобки (`}`) или других значащих элементов синтаксиса.

В вашем коде проблема находится в функции `print_arr`. Вы не закрыли фигурную скобку для этой функции. Ниже приведен исправленный блок кода:

```cpp
void print_arr(int** arr_arr){
    unsigned int len = sizeof(arr_arr)/sizeof(int*);
    for (size_t i = 0; i < len; ++i){
        unsigned int len_2 = sizeof(arr_arr[i])/sizeof(int);
        for (size_t j = 0; j < len_2; ++j){
            printf("%d\n", arr_arr[i][j]);
        } // Здесь должна быть скобка для закрытия внутреннего цикла
    } // И здесь закрывается функция
}
```

### Дополнительные замечания:

1. В функции `get_array_of_arrays` вы используете переменную `a` в цикле `for`, что может привести к бесконечному циклу. Вместо этого вы должны использовать `i`:

   ```cpp
   for (size_t i = 0; i < a; ++i) {
   ```

2. В функции `fill_array`, как и в функции `print_arr`, использование `sizeof(arr_arr)` не даст вам правильное значение, так как `arr_arr` является указателем, а не массивом. Для определения длины массива вам нужно передавать его размер в качестве параметра или использовать другой подход.

3. Не забывайте об освобождении динамически выделенной памяти, когда она больше не нужна, чтобы избежать утечек памяти.

Вот некоторые правильные строки кода с исправлениями:

```cpp
int** get_array_of_arrays(unsigned int a){
    int** arr_arr = calloc(a, sizeof(int*));
    for (size_t i = 0; i < a; ++i) {   // исправлено: ++a на ++i
        int b;
        scanf("%d", &b);
        arr_arr[i] = calloc(b, sizeof(int));
    }
    return arr_arr;
}

void fill_array(int** arr_arr, unsigned int a) {  // добавляем параметр a
    for (size_t i = 0; i < a; ++i) {
        unsigned int len_2;
        scanf("%d", &len_2); // считываем длину для второго массива
        arr_arr[i] = calloc(len_2, sizeof(int)); // выделяем память
        for (size_t j = 0; j < len_2; ++j) {
            int filler;
            scanf("%d", &filler);
            arr_arr[i][j] = filler;
        }
    }
}

int main(){
    int n;
    scanf("%d", &n);
    int** array_of_arrays = get_array_of_arrays(n);
    fill_array(array_of_arrays, n); // заполняем массивы
    print_arr(array_of_arrays, n);   // нужно будет передать n или размер
    // Освобождение памяти после использования
    for (size_t i = 0; i < n; ++i) {
        free(array_of_arrays[i]);
    }
    free(array_of_arrays);
}
```

После внесения этих исправлений ваш код должен компилироваться и работать без упомянутой ошибки.
Пропущена закрывающая фигурная скобка в print_arr
Похожие вопросы