From owner-freebsd-questions@FreeBSD.ORG Fri May 7 17:18:25 2004 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 655F416A4CE for ; Fri, 7 May 2004 17:18:25 -0700 (PDT) Received: from smtp1.adl2.internode.on.net (smtp1.adl2.internode.on.net [203.16.214.181]) by mx1.FreeBSD.org (Postfix) with ESMTP id 573AC43D46 for ; Fri, 7 May 2004 17:18:24 -0700 (PDT) (envelope-from malcolm.kay@internode.on.net) Received: from beta.home (ppp48-135.lns1.adl2.internode.on.net [150.101.48.135])i480IFZq015093; Sat, 8 May 2004 09:48:16 +0930 (CST) From: Malcolm Kay Organization: at home To: Henrik W Lund , freebsd-questions@freebsd.org Date: Sat, 8 May 2004 09:48:15 +0930 User-Agent: KMail/1.5.4 References: <20040506190033.A45C616A5CF@hub.freebsd.org> <409AAA48.50409@broadpark.no> In-Reply-To: <409AAA48.50409@broadpark.no> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200405080948.15164.malcolm.kay@internode.on.net> cc: ckorves@hotmail.com Subject: Re: segmentation fault-- is my array too long? X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 08 May 2004 00:18:25 -0000 On Friday 07 May 2004 06:42, Henrik W Lund wrote: .... > malloc() is your friend! :-) > > --> double *ncost = malloc(sizeof (double) * persons * scens); <-- > > This ought to do the trick. Just remember to make sure that malloc > returns a valid pointer, otherwise you'll have another seg fault. > > I'm pretty sure you can adress the pointer like you do with the array > there (ncost[persons][0], etc...); if not, you can always do > ncost(sizeof(double) * persons + 0), etc... > > /* AMENDMENT!!! */ > In my haste, I totally forgot my pointer dereferencing. The correct way > to reference a pointer as a two dimensional array is, of course, thus: > > *(ncost + (sizeof(double) * persons) + 0)) = 0.00; You've still got it wrong! ncost increments in units of size equal to that which it points so it should be: *(ncost + person*scens + scen) where person is the first index and scen the second. or in the particular instance *(ncost + person*scens + 0) = 0.00; For easier to read code it would be better to use: double (*ncost)[scens] = malloc( persons * sizeof *ncost ); and dereference as: ncost[person][scen] or in particular ncost[person][0] = 0.0; And for the OP it is usual to write constants generated with #define in upper-case. It generally seems to help to make the code easier to follow. In this case: PERSONS instead of persons and SCENS instead of scens This also make the distinction between PERSONS and person more evident while retaining their implied connection. Malcolm