неверное применение 'sizeof' к неполному типу 'int []' при доступе к целочисленному массиву, указанному указателем - PullRequest
1 голос
/ 09 марта 2011

Я пытаюсь выучить указатель на C и пишу это небольшое упражнение на указатель целочисленного массива, но натолкнулся на недопустимое приложение sizeof к неполной проблеме типа int[].Подскажите пожалуйста где я ошибся и как это решить.Спасибо.

#include <stdio.h>

int intA[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int intB[];

void int_copy(const int *source, int *destionation, int nbr)
{
    int i;
    for(i=0;i<nbr;i++)
    {
        *destionation++ = *source++;
    }
}

int main()
{
    int *ptrA = intA;
    int *ptrB = intB;

    int sizeA = sizeof(intA);
    int nbrA = sizeof(intA)/sizeof(int);
    printf("\n\n");
    printf("[Debug]The size of intA is:%d\n", sizeA);
    printf("[Debug]That means the number of elements is:%d\n", nbrA);

    printf("\n\nThe values of intA are:\n");
    int i;
    for(i=0;i<nbrA;i++)
    {
        printf("[%d]->%d\n", i, intA[i]);
    }


    int_copy(ptrA, ptrB, nbrA);
    int sizeB = sizeof(intB);
    int nbrB = sizeof(intB)/sizeof(int);
    printf("\n\n");
    printf("[Debug]The size of intB is:%d\n", sizeB);
    printf("[Debug]That means the number of elements is:%d\n", nbrB);

    printf("\n\nThe values of intB are:\n");
    for(i=0;i<nbrB;i++)
    {
         printf("[%d]->%d\n", i, *ptrB++);
    }

}

# cc -g -o int_copy int_copy.c
int_copy.c: In function 'main':
int_copy.c:36: error: invalid application of 'sizeof' to incomplete type 'int[]' 
int_copy.c:37: error: invalid application of 'sizeof' to incomplete type 'int[]'

Странная вещь, которую я заметил, - когда я запускал gdb, я наблюдал, что функция копирования int_copy запускается 9 раз, что кажется правильным, но печать intB послеФункция копирования отображает только один элемент в этом массиве.

Я все еще бьюсь над указателями, поэтому, пожалуйста, помогите мне и простите мое невежество.Большое спасибо.

Ответы [ 3 ]

10 голосов
/ 09 марта 2011

intB - это, в основном, указатель, а sizeof на нем даст то же самое, что и sizeof на int, поэтому печать появляется только один раз. intA - это массив с известным размером, поэтому sizeof работает.

Вы должны помнить, что sizeof не является вызовом во время выполнения, хотя это может выглядеть так синтаксически. Это встроенный оператор, который возвращает размер типа в байтах во время компиляции, а во время компиляции intB является указателем, который позднее должен указывать на вновь выделенный массив.

2 голосов
/ 09 марта 2011

У вас здесь тоже проблемы, потому что IntB не имеет размера, поэтому int_copy действительно не работает для него.Там некуда копировать бронзу!

При объявлении массива вы должны либо указать размер внутри [], либо использовать инициализатор со значениями, чтобы компилятор мог их подсчитать и сам определить размер.

1 голос
/ 09 марта 2011

На самом деле ваш оператор int intB[]; недействителен, какой компилятор вы используете?

Кроме того, помните, что массивы и указатели на самом деле не совпадают. Однако вы можете использовать дескриптор массива при вызове функции, которая ожидает указатель, поэтому вы можете присвоить intA вашей функции int_copy без копирования ее в указатель. http://www.lysator.liu.se/c/c-faq/c-2.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...