How to pass static array to function not by value?
    H. S. Teoh via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Sat Nov 22 08:07:31 PST 2014
    
    
  
On Sat, Nov 22, 2014 at 05:57:30PM +0200, ketmar via Digitalmars-d-learn wrote:
> On Sat, 22 Nov 2014 15:45:51 +0000
> Eric via Digitalmars-d-learn <digitalmars-d-learn at puremagic.com> wrote:
> 
> > Maybe this is not so lame because change() can take
> > any length of static array.
> 
>   void change (int[] arr) {
>     arr[1] = 42;
>   }
> 
>   void main () {
>     int[$] a = [1, 2, 3];
>     change(a);
This is actually really scary that static arrays implicitly decay to a
dynamic array slice. It can cause all sorts of problems with escaping
dangling references to local variables:
Example #1:
	int[] bad(int[] arr) {
		return arr;
	}
	int[] equallyBad() {
		int[3] x = [1,2,3];
		return bad(x);	// oops
	}
Example #2:
	struct S {
		int[] data;
		this(int[] arr) {
			data = arr;
		}
	}
	S makeS() {
		int[3] x = [1,2,3];
		return S(x);	// oops
	}
Example #3:
	struct S {
		int[] data;
		this(int[] arr...) {	// red flag
			data = arr;
		}
	}
	void main() {
		auto s = S([1,2,3]);	// OK
		auto t = S(1,2,3);	// NG
	}
IMO, at the very least, an explicit slice should be required to turn a
static array into a dynamic array slice. That way, the programmer at
least has to think for 1 second (hopefully more) whether or not he
should be passing a slice to a static array.
T
-- 
Those who don't understand Unix are condemned to reinvent it, poorly.
    
    
More information about the Digitalmars-d-learn
mailing list