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