# allocating bidimensional matrix

Show 50 post(s) from this thread on one page
Page 1 of 2 12 Last
• July 31st, 2009, 10:25 AM
EvIl_DeViL
allocating bidimensional matrix
hi all!! I need to create a function that by reference reallocate an asymmetrical bidimensional
character matrix...
I've done something like that but it crash...

================================CODE================================

#include <iostream>

using namespace std;

void add(char ***list, int n, char *person)
{
static int GlobStrLen = 0;
*list = (char**) realloc(*list, GlobStrLen * sizeof(char**));
*list[n] = (char*) malloc (strlen(person) + 1);
strcpy(*list[n], person);
GlobStrLen += strlen(person) + 1;
}

int main()
{
char **list = NULL;
int n = 0;

printf("list[0]: %s\n", list[0]);

n++;

printf("list[1]: %s\n", list[1]);

return 0;
}

================================END CODE============================

thank you for yours replies!!!
• July 31st, 2009, 10:56 AM
VictorN
Re: allocating bidimensional matrix
1. Please, use Code tags. See http://www.codeguru.com/forum/misc.php?do=bbcode#code

2.
Quote:

Originally Posted by EvIl_DeViL;1865712[CODE
]#include <iostream>

using namespace std;

void add(char ***list, int n, char *person)
{
static int GlobStrLen = 0;
*list = (char**) realloc(*list, GlobStrLen * sizeof(char**));
*list[n] = (char*) malloc (strlen(person) + 1);
strcpy(*list[n], person);
GlobStrLen += strlen(person) + 1;
}[/CODE]

So, reallocate some buffer with the size zero? :confused:

3. Is there some reason to use malloc/realloc rather than new/delete? :confused:
or it is just a plain C (not a C++) code?
• July 31st, 2009, 11:12 AM
Skizmo
Re: allocating bidimensional matrix
'list' is NULL, so how do you want to REalloc that ?
• July 31st, 2009, 11:21 AM
Paul McKenzie
Re: allocating bidimensional matrix
Quote:

Originally Posted by VictorN
Or it is just a plain C (not a C++) code?

It's definitely supposed to be C++, as <iostream> is included. The problem is that the code is written as if it was 'C'.

Regards,

Paul McKenzie
• July 31st, 2009, 11:25 AM
Lindley
Re: allocating bidimensional matrix
Quote:

Originally Posted by Skizmo
'list' is NULL, so how do you want to REalloc that ?

realloc behaves like malloc if its first argument is NULL.

I would advise using a vector<string> for this problem.
• July 31st, 2009, 11:50 AM
EvIl_DeViL
Re: allocating bidimensional matrix
thank you for your many replies!
sorry for the CODE tag... I didn't find it :P
quoting lindley for the behaving of the realloc.
I used realloc instead new/delete beacause with the C++ operator you can't "realloc" memory unless you create another memory area of the same size of the one you want to realloc to be able to store your data and then re-copy in the "resized" original "area".
basically I can't see to much difference from the C operator and the C++ operator to manage the memory (talking about char type) so I thought I'd better use realloc instead creating a self-made one with new/delete.
I think it doesn't matter if I use C or C++. the only thing to pay attention for is use only malloc/realloc/free or new/delete.
for the goal i'm trying to reach i think I can do the same thing with the C dynmem stuff or the C++ dynmem stuff...
Code:

`*list = (char**) realloc(*list, GlobStrLen * sizeof(char**));`
i made it for keeping the memory contiguous.
anyway all this code work only for the first element...
p.s. I'd prefer a C style solution for the problem... i feel it much lower and manageable instead a C++ style one.

THANK YOU!!
• July 31st, 2009, 12:42 PM
Skizmo
Re: allocating bidimensional matrix
Quote:

realloc behaves like malloc if its first argument is NULL.
Ah... never used it, hence the confusion :)
• July 31st, 2009, 12:47 PM
Paul McKenzie
Re: allocating bidimensional matrix
Quote:

Originally Posted by EvIl_DeViL
hi all!! I need to create a function that by reference reallocate an asymmetrical bidimensional
character matrix...

1) What do you mean "by reference"?

2) Do not name your variable "list", as there already is a std::list class in C++.

3) Using vector<string>
Code:

```#include <iostream> #include <string> #include <cstdio> #include <vector> typedef std::vector<std::string> StringArray; int main() {     StringArray theList;     theList.push_back("jack");     printf("list[0]: %s\n", theList[0].c_str());     theList.push_back("jeff");     printf("list[1]: %s\n", theList[1].c_str());     return 0; }```
This code does the same as yours, and there are no pointers involved.

Regards,

Paul McKenzie
• July 31st, 2009, 12:48 PM
Paul McKenzie
Re: allocating bidimensional matrix
Quote:

Originally Posted by EvIl_DeViL
p.s. I'd prefer a C style solution for the problem... i feel it much lower and manageable instead a C++ style one.

If you take a look at my post, and your first post, which one seems more manageable to you (or to most other C++ programmers)?

Regards,

Paul McKenzie
• July 31st, 2009, 12:53 PM
Paul McKenzie
Re: allocating bidimensional matrix
Quote:

Originally Posted by EvIl_DeViL
the only thing to pay attention for is use only malloc/realloc/free or new/delete.

Why? What are the reasons for this requirement?

Regards,

Paul McKenzie
• July 31st, 2009, 01:03 PM
EvIl_DeViL
Re: allocating bidimensional matrix
interesting solution... I stopped studing C++ after class... so i miss all the strange template stuff, the std library, and so on... good excuse for getting an upgraded!!! many thanks!!!
(it's still be interesting viewing the realloc version :P)

Quote:

Originally Posted by Paul McKenzie
Why? What are the reasons for this requirement?

Regards,

Paul McKenzie

don't use delete for unlocating an area allocated by malloc/calloc/realloc and don't "free()" an area allocated by new because they manage memory in different ways!
• July 31st, 2009, 01:17 PM
JVene
Re: allocating bidimensional matrix
Quote:

(it's still be interesting viewing the realloc version :P)
Same code sample.

Vector will automatically expand as required.

Great stuff!
• July 31st, 2009, 02:56 PM
EvIl_DeViL
Re: allocating bidimensional matrix
Quote:

Originally Posted by JVene
Same code sample.

Vector will automatically expand as required.

Great stuff!

can you post some example code please? I can't figure...
• July 31st, 2009, 03:12 PM
Lindley
Re: allocating bidimensional matrix
Quote:

Originally Posted by EvIl_DeViL
I used realloc instead new/delete beacause with the C++ operator you can't "realloc" memory unless you create another memory area of the same size of the one you want to realloc to be able to store your data and then re-copy in the "resized" original "area".

A good reason, right up until you realize that std::vector::resize() is C++'s answer to realloc----plus it makes things even easier by completely hiding the fact that you're working with dynamic memory at all.

Unless you're working with strings specifically, in which case std::string has some behaviors which are more intuitive than std::vector<char>.
• July 31st, 2009, 03:30 PM
Paul McKenzie
Re: allocating bidimensional matrix
Quote:

Originally Posted by EvIl_DeViL
interesting solution... I stopped studing C++ after class... so i miss all the strange template stuff, the std library, and so on... good excuse for getting an upgraded!!! many thanks!!!
(it's still be interesting viewing the realloc version :P)

There are several threads that have full source to routines that create dynamically allocated 2D arrays.
Quote:

don't use delete for unlocating an area allocated by malloc/calloc/realloc and don't "free()" an area allocated by new because they manage memory in different ways!
What I meant by "what were your reasons for this requirement" is to see why you needed to create a multidimensional array using 'C' methods instead of just using vector<string>.

Regards,

Paul McKenzie
Show 50 post(s) from this thread on one page
Page 1 of 2 12 Last