问题描述
int tab[] = {0,2,5,3,9,8,4,0};
printf("taille %d: \n",sizeof(tab));
for (int i=0; i<sizeof(tab); i++)
{
printf("indice : %d et valeur :%d \n",i,*(tab + i ));
}
解决方法
sizeof(tab)
生成包含 tab
元素的所有数组 13
的字节大小,每个元素的大小等于 sizeof( int )
(与 { {1}})。那是
sizeof( *tab )
等于 sizeof(tab)
,而 13 * sizeof( int )
又可以等于 52
,前提是 sizeof( int )
等于 4
。
但是你只需要输出数组的 13 个元素。
所以你应该写例如
int tab[] = {0,2,5,3,9,8,4,0};
const size_t N = sizeof( tab ) / sizeof( *tab );
printf( "taille %zu: \n",N );
for ( size_t i = 0; i < N; i++ )
{
printf( "indice : %zu et valeur :%d \n",i,*(tab + i ) );
}
putchar( '\n' );
注意输出 size_t
类型的对象需要使用转换说明符 zu
。
这是一个演示程序,其中将数组输出放在一个单独的函数中。
#include <stdio.h>
FILE * output( const int tab[],size_t n,FILE *fp )
{
fprintf( fp,"taille %zu: \n",n );
for ( size_t i = 0; i < n; i++ )
{
fprintf( fp,"indice : %zu et valeur :%d \n",*(tab + i ) );
}
return fp;
}
int main(void)
{
int tab[] = {0,0};
const size_t N = sizeof( tab ) / sizeof( *tab );
fputc( '\n',output( tab,N,stdout ) );
return 0;
}
程序输出为
taille 13:
indice : 0 et valeur :0
indice : 1 et valeur :2
indice : 2 et valeur :5
indice : 3 et valeur :3
indice : 4 et valeur :9
indice : 5 et valeur :0
indice : 6 et valeur :8
indice : 7 et valeur :9
indice : 8 et valeur :2
indice : 9 et valeur :0
indice : 10 et valeur :4
indice : 11 et valeur :3
indice : 12 et valeur :0
,
线
printf("taille %d: \n",sizeof(tab));
调用未定义行为,通过将错误类型的数据传递给printf()
,允许任何事情发生。 %d
期望 int
,但 sizeof
返回 size_t
。以十进制打印 size_t
的正确格式说明符是 %zu
。
那么,sizeof(tab)
是以字节为单位的数组 tab
的大小(严格来说是 char
的数量)。它不是元素的数量。要获得元素的数量,您必须将其除以一个元素 sizeof(*tab)
的大小。
int tab[] = {0,0};
printf("taille %zu: \n",sizeof(tab));
for (int i=0; i<sizeof(tab)/sizeof(*tab); i++)
{
printf("indice : %d et valeur :%d \n",*(tab + i ));
}