Problems with Malloc and Character array

Started by
3 comments, last by gp343 16 years, 2 months ago
What is the best way to use malloc to declare an array of characters string? I've used the below method but when I read the values bad the data is all corrupted. Can somebody please show me the correct way to use malloc to declare an array of character strings? int array_Length; char * NamesList; array_Length = 140; NamesList = (char *) malloc(array_Length * sizeof(char )); if (NamesList == NULL) { printf("%s \n" "Memory allocation failed. Goodbye., ERROR_MESSGAE"); exit(EXIT_FAILURE); } Many thanks
Advertisement
The data that is pointed to after a successful malloc() is not guaranteed to be clear. The data in there will be garbage. Following this malloc you should be writing something meaningful to it in order for what you read out to make any sense at all.

May i suggest that you use std::string if you are writing your program in C++.

May i also suggest that you initialise the variables like so:

int array_Length( 140 );char* NamesList( malloc( array_Length * sizeof( char ) ) );

Hi Dave,

I'm sorry if I wasn't clear at first, however, I am writing some values to the NamesList array. I open a text file and read in the values from there. However, when I go to ready the values that is when I get all garbage. I've traced in debug mode the code and can confirmed that I'm populating the NamesList array.

On the point of using the c++ string, I would say yes, however, I want to learn the right way to use malloc to achieve this. Surely there must be a way?

Thanks
Quote:Original post by gp343
What is the best way to use malloc to declare an array of characters string?


In C++, it's best not to use malloc at all: it interacts badly with most language features and forces you to handle the free/delete duality on your own. For allocating a buffer of characters, using new[] is an awkwardly superior solution (though inferior to both std::string and std::vector<char>). Typical use:

const int array_length = 140;char *names_list = new char[array_length];try{  // Use 'names_list'}catch(...){  delete[] names_list;  throw;}delete[] names_list;


Don't forget the exception-handling code if the usage includes any non-primitive functions. Also, the allocation will throw an exception if it fails, unlike malloc which returns null.

As far as malloc in C goes, typical usage would be:

int array_length = 140;char *names_list = malloc(array_length * sizeof(char*));// Use 'names_list'free (names_list);


Of course, the C version should not be used in C++ for obvious reasons (including exception-unsafety and type-unsafety).
I solved, it. It was a mistake on my part - I was referencing a freed object :-)

This topic is closed to new replies.

Advertisement