2012-03-20 52 views
0

如果字数组的大小没有从主函数传递,该程序只显示一个输出“Hiii”。
如果内部disp函数产生大小显示
尺寸:48
大小:2
HIII二维字符数组的sizeof()显示错误o/p

如果尺寸是从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

编译
+0

btw这不是'作业' – Sourav 2012-03-20 03:33:01

+0

可能的重复[C编程语言中的数组的大小?](http://stackoverflow.com/questions/1975128/sizeof-an-阵列内式C-编程语言) – 2012-03-20 13:56:53

回答

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

main()sizeof给出阵列的大小。
sizeof函数disp()给出指针的大小。

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

1

你需要更好地理解数组和指针的区别。此外,sizeof是在编译时计算的,所以main中的sizeof可以得到实际的大小(你的单词数组是一个二进制的char数组,而不是一个常规的char指针数组,所以每行的大小为12,总数为48)。在disp中,无法知道数组在哪里结束,因此无法确定其大小。阅读k & r更好地理解