stack dump accessing malloc char array

1k Views Asked by At

gcc 4.4.3 c89

I have the following source code. And getting a stack dump on the printf.

char **devices;
devices = malloc(10 * sizeof(char*));

strcpy(devices[0], "smxxxx1");

printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */

I am thinking that this should create an char array like this.

devices[0]
devices[1]
devices[2]
devices[4]
etc

And each element I can store my strings.

Many thanks for any suggestions,

== Added correction ===

for(i = 0; i < 10; i++)
{
    devices[i] = malloc(strlen("smxxxx1")+1);
}
6

There are 6 best solutions below

1
On BEST ANSWER

You have allocated memory for an array of pointers. You need to allocate the memory for each element to store the string

e.g.

#define NUM_ELEMENTS 10
char **devices;
devices = malloc(NUM_ELEMENTS  * sizeof(char*));

for ( int i = 0; i < NUM_ELEMENTS; i++)
{
    devices[i] = malloc( length_of string + 1 );
}
0
On

you have allocated space for pointers (devices) but have not allocated space for strings you are going to store.

3
On

You only have allocated an array of pointers to character-arrays. You will have to allocate memory for each string you plan to store:

char **devices;
devices = malloc(10 * sizeof(char*));

//Added this line:

devices[0] = (char*)malloc(strlen("smxxxx1")+1);
strcpy(devices[0], "smxxxx1\0");

printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */
0
On

You have allocated memory for storing 10 char pointers. To store a string at these memory location you have to allocate memory for each of them. Basically you need something like device[0] = malloc(stringLen + 1); for each pointer.

0
On

devices[0] is a char *, but you haven't allocated any storage for it. Do this instead:

char **devices;
devices = malloc(10 * sizeof(char*));

devices[0] = strdup("smxxxx1");

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

Eventually, you'll have to free the memory allocated by strdup():

free(devices[0]);
3
On

devices is an array of pointers. You are copying the string "smxxxx1" over the array, when it looks like you want to set element 0 to point to the string.

Instead of the strcpy() try:

devices[0] = "smxxxx1"

or

devices[0] = strdup("smxxxx1")

Edit:

On a 32 bit system, devices[0] is composed of four bytes. These four bytes are being overwritten with the byte values of the first four characters of the string "smxxxx1". In ascii these are 0x73, 0x6D, 0x78, 0x78. Assuming little-endian addressing, you end-up with devices[0] containing a pointer to the address 0x78786D73. This address will almost certainly not be valid within the process. When the call to printf() tries to dereference this invalid pointer the OS triggers a segmentation fault and dumps core.

The problem was that the OP was incorrectly treating the devices variable as a string (array of char) when initialising it. Its actually an array of pointers to char, and printf() is interpreting it as such.