error allocating memory with realloc(). how can i increase
max_allowed in the system?
Derek Taylor
det135 at psu.edu
Wed Aug 20 23:34:31 UTC 2008
On Tue, 12 Aug 2008, Jordi Moles Blanco wrote:
>Hi,
>
>i'm running a FreeBSD 7.0 amd64 machine and struggling with some C code
>i'm writing.
In addition to the other comments already given, I think that it might
be useful for your learning experience to have some additional comments.
>I've had some trouble with this home-made script as it keeps crashing
>while launching a "realloc()" call.
>
>I narrowed down the problem and here i'm sending you a short example of
>code that crashes:
>
>*************
>#include <stdio.h>
>#include <stdlib.h>
>
>int main()
>{
>
> int midataula;
>
> midataula = 3000;
>
> char *missatge = (char *)malloc(midataula * sizeof(char));
You should not cast the return value of malloc. [1]
> missatge[0]='h';
> missatge[1]='o';
> missatge[2]='l';
> missatge[3]='a';
Recall that malloc() makes no promises about the contents of the memory
allocated. I recommend, in the current style, adding:
missatge[4]='\0';
> printf("\n\ntaula1: %s",missatge);
>
> int voltes;
> voltes = 0;
Traditionally in C, all variable declarations appear at the beginning of
the local scope. Declaring new variables mid-scope is valid in certain
off-shoots of C and may be acceptable in newer dialects/standards of the
language, but the majority of C programmers might make certain
assumptions about your code following older traditions.
This certainly is not too egregious, but while I was here, I thought I'd
mention it.
> while(voltes<4)
> {
> midataula = midataula+500;
> realloc(missatge, midataula * sizeof(char));
> voltes++;
> }
>
>
> printf("\n\ntaula2: %s",missatge);
>}
>*************
>
>
>this is a full "working" you can compile on your machine.
>
>Like this... i get "Segmentation fault (core dumped)"
>
>but if instead of "while(voltes<4)" i use "while(voltes<3)"
>
>the script works fine with this output:
>
>**********
>taula1: hola
>
>taula2: hola
>**********
>
>so... i guess there must be a limit in the system somewhere.
>
>I've tried to reset all variables that i've seen in the "sysctl -a" list
>refering to malloc, memory, mem, and so on... but so far i haven't fixed
>the problem.
>
>i'm running this script as root and in the /etc/login.conf file there's
>only the "default" group with the "unlimited" values.
>A part from that, if i perform a "limit" call, i get this:
>
>*************
>
># limit
>cputime unlimited
>filesize unlimited
>datasize 33554432 kbytes
>stacksize 524288 kbytes
>coredumpsize unlimited
>memoryuse unlimited
>vmemoryuse unlimited
>descriptors 45000
>memorylocked unlimited
>maxproc 22500
>sbsize unlimited
>
>*************
>
>i've tried to resize datasize and stacksize, but the system won't let me
>do so.
>
>any idea how to solve this?
>
>thanks.
>
Good luck with your programming and systems work!
-Derek.
[1] <http://c-faq.com/malloc/mallocnocast.html>
More information about the freebsd-questions
mailing list