2017-10-08 83 views
1

我明白为什么一个数组衰变时传递给函数没有指定其大小为指针,如:为什么当大小

void test(int array[]); 

为什么会做这么过去了呢C数组衰变为指针当通过大小?例如。

void test(int array[3]); 

我具有后一功能的签名,这是令人沮丧的数组长度是在编译时清楚知道下与sizeof麻烦。

+4

这就是语言如何被定义(并且已经很长时间了) - 要么将大小作为单独的参数传递,要么将数组嵌入到结构中,要么切换到不同的语言。 –

+1

因为这就是它的设计。我们可以给你一个历史课,但它对你没有多大帮助。 – user2357112

+2

这是代表语言设计者的优化。人们当然可以同意他们的看法,或者认为回想起来还为时过早。但这就是语言的设计。 – StoryTeller

回答

3
void test(int* array); 
void test(int array[]); 
void test(int array[3]); 

所有这些变体都是相同的。 C只是让你使用替代拼写,但即使最后一个变体显式注释数组大小衰减到指向第一个元素的指针。

也就是说,即使最后实现,你可以调用函数与任何大小的数组:

void test(char str[10]) { } 

test("test"); // Works. 
test("let's try something longer"); // Still works. 

有没有神奇的解决方案,来处理这个问题的最易读的方式是,要么做一个struct与数组+大小或只是将大小作为附加参数传递给函数。

LE:请注意,此转换仅适用于数组的第一维。当传递给函数时,int[3][3]转换为int (*)[3],而不是int **

+0

所以int数组[3]比其他任何东西更适合程序员的利益吗? – Dimpl

+0

在我看来,它不应该被使用。它可能会给用户一种错误的安全感(“哦,这个函数只接受长度为3的数组,所以我不需要自己检查长度”)。 – Valdrinit

1

因为您无法正确调用此功能。在几乎所有上下文中,数组都会衰减到指向第一个元素的指针,并且在尝试调用函数时,数组首先会转换为指针,并且调用将会不匹配。 不是衰减的唯一上下文是运营商sizeof,_Alignof,_Alignas&。这些更容易检测句法。