Re: problem with memory allocation

From: Stephan Szabo <sszabo(at)megazone(dot)bigpanda(dot)com>
To: Kjetil Haaland <kjetil(dot)haaland(at)student(dot)uib(dot)no>
Cc: pgsql-novice(at)postgresql(dot)org
Subject: Re: problem with memory allocation
Date: 2004-11-26 16:52:52
Message-ID: 20041126083850.L93506@megazone.bigpanda.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice

On Fri, 26 Nov 2004, Kjetil Haaland wrote:

> Hello all
> Sorry for asking so many question about this topic, but i don't get it to
> work. The problem is when i allocate memory for char pointers (char*). I have
> a function that i run many times in my db. The first time i allocate memory
> for the char* it is ok, and it is set to the length that i say it should
> have. In the next round, i give a smaller input and tries to allocate memory
> for this.
>
> The first problem is when i try to print out the pointer after the allocation,
> but before the insert it is what i inserted the last time i used the
> function.
> The second problem, coming from the first, is that it has the length from the
> first allocation, not the length that i set it to have.

That's because AFAICS you're misusing the output of palloc as a string
when you haven't put a string into it. After allocation, it seems you
have two pointers, one which has secondStart bytes allocated, the other
which has strlen(align->stringBuffer)-secondStart+1 bytes allocated. The
values of the bytes inside those allocated bytes are technically
indeterminate, so using %s or strlen on them is invalid.

More fundamentally, it feels like you're trying to use strlen() to get the
size of the allocated space [in statements like first[strlen(first)]='\0']
which is not what strlen does. Strlen generally moves through memory
starting at the pointer looking for a '\0' character and if one does not
exist within the size you've allocated, the behavior is undefined.
first[strlen(first)]='\0' is pretty much a no op, since either it found a
\0 character within the buffer (in which case that should already be a
\0 or went off the end of the buffer (in which case you can't rely on
strlen returning something meaningful, and even if it did, it's not in the
object, so you shouldn't be writing to it anyway).

In response to

Responses

Browse pgsql-novice by date

  From Date Subject
Next Message Tom Lane 2004-11-26 18:02:53 Re: What causes 'FATAL: invalid cache id: 30' in my postgresql log?
Previous Message Bruno Wolff III 2004-11-26 15:53:56 Re: Querying a list field against another list