2维字符数组的sizeof()显示错误的o / p

时间:2012-03-20 03:32:40

标签: c multidimensional-array sizeof

如果未从主函数传递单词数组的大小,则此程序仅显示一个输出“Hiii”。
如果在disp函数内生成大小,则显示
尺寸:48
尺寸:2
Hiii

如果从main函数显示大小,则显示 尺寸:48
尺寸:48
HIII
你好
你好有 Hello World

#include<stdio.h>
#include<conio.h>

void disp(char words[][12],int size)
{
 int i,j;
 char *p,*cp;
 p=words;
 size=sizeof(words);
 printf("Size %d\n",size);
 for(cp=p;cp<(p+size);cp+=12)
 {
  printf("%s",cp);
  printf("\n");
 }
}

void main()
{
 char words[][12]={"Hiii","Hello","Hello There","Hello World"};
 int size;
 clrscr();
 size=sizeof(words);
 printf("Size %d\n",size);
 disp(words,size);
 getch();
}

在Borland Turbo C中编译的程序

3 个答案:

答案 0 :(得分:2)

在C中,传递数组的语法实际上只是说你传递指针的另一种方式。例如:

void f(int a[])

只是另一种说法

void f(int *a)

这是该语言中的一种特殊语法,它旨在使参数更加自我记录,但在您所描述的情况下也会令人困惑。

在您的情况下,声明:

void disp(char words[][12],int size)

实际上在说

void disp(char (*words)[12],int size)

也就是说,单词是指向12个字符数组的指针。在你的情况下,指针的大小是两个字节。

答案 1 :(得分:1)

sizeof中的main()给出了数组的大小 函数sizeof中的disp()给出了指针的大小。

这是因为当您尝试将数组传递给函数时,它会衰减到指向其第一个元素的指针 获取函数内部数组大小的唯一方法是将其作为单独的函数参数传递,这是最常用的方法。

答案 2 :(得分:1)

您需要更好地理解数组和指针之间的区别。另外,sizeof是在编译时计算的,因此main中的单词大小可以得到实际大小(你的单词数组是一个双向字符数组,而不是传统的char指针数组,因此每行的大小为12,总共48个)。在disp内部,无法知道数组的结束位置,因此无法确定其大小。阅读k&amp; r以便更好地理解