'sizeof'无效应用于不完整类型'int []'当访问指针指向的整数数组时

时间:2011-03-09 01:37:50

标签: c pointers

我正在尝试学习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 个答案:

答案 0 :(得分:10)

intB基本上是指针,sizeof上的sizeofint上的intA相同,这就是打印只出现一次的原因。 sizeof是一个已知大小的数组,因此sizeof可以正常工作。

您需要记住intB不是运行时调用,尽管它可能看起来很符合语法。它是一个内置的运算符,在编译时返回类型的大小(以字节为单位),在编译时{{1}}是一个指针,稍后应指向新分配的数组。

答案 1 :(得分:2)

你在这里也遇到了麻烦,因为IntB没有大小,所以int_copy确实不适合它。没有地方可以复制整数!

声明一个数组时,你必须在[]中给出大小,或者使用带有值的初始值设定项,这样编译器就可以计算它们并计算出它自身的大小。

答案 2 :(得分:1)

实际上你的int intB[];语句无效,你正在使用哪个编译器?

另外,请注意数组和指针实际上并不相同。但是,您可以在调用需要指针的函数时使用数组句柄,这样您就可以将intA赋予int_copy函数而不将其复制到指针。 http://www.lysator.liu.se/c/c-faq/c-2.html