Visit The New, Modern Unix Linux Community


Malloc to void pointer fails


 
Thread Tools Search this Thread
Top Forums Programming Malloc to void pointer fails
# 1  
Malloc to void pointer fails

I have a function to which I will pass a struct ID and it will return me a string.
I will pass a pointer to store the name string and that pointer will be allocated memory by the function called.
Code:
int ConvertIDToName(void *id, void *name, size_t *size)
{
    int         status = 0;
    unsigned char *xIDname = "user4.microsoft.com";

    *name = (unsigned char*)malloc(30);
    memcpy(*name, xIDName, *size);

    ...

    return(0);
}

Code:
main(int argc, char* argv[])
{
    struct ID_t idObj ={1,5, {0,0,0,0,0,5}};
    unsigned char*        IDName = NULL;
    UINT32            IDNameSize = MAX_CHAR;

    ConvertIDToName(&idObj, &IDName, (size_t *)&IDNameSize);

    return(0);
}

The function ConvertIDToName() fails to store the allocated memory address in the void pointer.
I am unable to assign memory in the pointer and it gives me error from 3rd statement of function ConvertIDToName():
Code:
 
   warning: dereferencing ‚void *‚ pointer
    test_code.c:683: error: invalid use of void expression

What am I doing wrong?

---------- Post updated at 02:33 AM ---------- Previous update was at 02:32 AM ----------

I missed the simple thing of typecasting the void pointer before using it.
This solves the issue:
Code:
*(unsigned char **)name = malloc(30);
memcpy(*(unsigned char **)name, xIDName, *size);

# 2  
Why is it 'void' in the first place? Make it a char **, and no typecasting is necessary.
This User Gave Thanks to Corona688 For This Post:
# 3  
When wanting to provide an address to a called pointer

Your code crashes because you are passing the address that "name" is pointing to
which is null.

So what you must do is pass the address of name as

int ConvertIDToName(void *id, void *&name, size_t *size) { int status = 0; unsigned char *xIDname = "user4.microsoft.com"; *name = (unsigned char*)malloc(30); /* this will work with the change */ memcpy(*name, xIDName, *size); ... return(0); }


---------- Post updated at 08:08 AM ---------- Previous update was at 08:05 AM ----------

int ConvertIDToName(void *id, void *&name, size_t *size) { int status = 0; unsigned char *xIDname = "user4.microsoft.com"; *name = (unsigned char*)malloc(30); memcpy(*name, xIDName, *size); ... return(0); }
This User Gave Thanks to lsatenstein For This Post:
# 4  
why does the ConvertIDToName prototype say "void * id" instead of "struct ID_t *" madness!!!

That's probably where your warning is. Don't use void * explicitly generally.

Is it really worth malloc'ing 30 bytes?
just declare a char array[30]

I don't see why 30 bytes? I mean you have GB of RAM are you saving it all for Christmas?
Will 30 bytes always be enough? 1024 may be enough if times change.

Give yourself some room for possible growth. And use powers of two, 64. 128, 256, 1024 etc.

Smilie

Last edited by bigearsbilly; 07-28-2014 at 07:06 AM..
# 5  
There is a lot of opinion in this thread, which is okay as long as a reader knows that fact.

Generally it is bad idea to cast malloc, because it is not required and may introduce subtle bugs that are hard to find, a discussion:

FAQ > Casting malloc - Cprogramming.com

Consider the use of a debugger, ex: gdb. This will help resolve crashes by examining core files, link:

RMS's gdb Tutorial: Segmentation Fault Example

Finally, allocating heap memory (malloc does this for you in C) is not all that simple.
If you allocate x+1 bytes for a string which should never be long than x, you have to check input carefully, otherwise if the string you enter is too long by a few bytes it probably will not segfault, it will simply trash a neighboring variable. Nasty.

Except for embedded systems (ex ARM), declaring strings longer than needed is less harmful, but still requires checking EVERY input string before parking it in the variable, because this makes an entry for a possible code exploit. Shell code and SQL injection come to mind.

malloc works this way in general:
1. at the beginning of code invocation, the brk() system call allocates pages of memory, and those pages then are controlled by malloc, not directly by your program code, normally. Do not call brk() on your own if you use malloc or functions like strdup which call malloc. Calling brk() directly in code that uses malloc usually results in chaos.

So if you malloc 10 bytes and page size is 8192 bytes (example), then you still have more already allocated memory available.

2. malloc keeps track of what it allocates, pages are in a page table, variables are tracked usually with some kind of descriptor. The descriptor is often a struct that consists of a pointer to the start of the variable (what malloc returns to you), and a length in bytes.

hypothetical example base on Doug Lea's original malloc:

[address of word aligned memory][length].... [word aligned memory]

So, if you increment or decrement the pointer you have (your variable) it no longer references [address of word aligned memory]. This causes free() to get nasty with you.

- finally, some of the suggestions in this thread are just that - there is both art and science in building good code.
# 6  
This is also potentially nasty:
Code:
(size_t *)&IDNameSize

How do you know that IDNameSize is a size_t? It's not defined as a size_t, it's defined as a UINT32.

UINT32 is not a size_t. Only size_t is size_t, which is why declarations use it in the first place. There are other address models than ILP32. Just try compiling on 64-bit Linux and you'll wind up with an LP64 binary.

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #522
Difficulty: Medium
11,223 = 0x2BD7
True or False?

9 More Discussions You Might Find Interesting

1. Programming

void pointer

hi guys! Is there such a thing as double void pointer dynamic allocation? And if so is it something like this? int n; void** a; a=malloc(n*sizeof(void*)); (12 Replies)
Discussion started by: vlm
12 Replies

2. HP-UX

converting void pointer to pthread_t on HPUX Itanium

i am trying to convert void pointer to pthread_t on hpux-itanium 64 bit which fails as below "src/file.cpp", line 88: error #2171: invalid type conversion pthread_t tid = reinterpret_cast<pthread_t>(m_threadId); 1 error detected in the compilation of "src/file.cpp" ... (0 Replies)
Discussion started by: skyineyes
0 Replies

3. Shell Programming and Scripting

Eliminate double void line

Hi, I need to eliminate each second void line in a text file. novus MILLENNIO ineo frater in episcopatus , presbyter et diacon|diaconus , (1 Reply)
Discussion started by: mjomba
1 Replies

4. Programming

tolower (static pointer + malloc + realloc)

N00B here. This function would be easier using a char pointer along with free. But I wish to learn how to use char static pointers (they do not require free, right ?). How do I erase the content of a static pointer ? Terminating the string works but the static pointer's content is not being... (4 Replies)
Discussion started by: limmer
4 Replies

5. Programming

pass a pointer-to-pointer, or return a pointer?

If one wants to get a start address of a array or a string or a block of memory via a function, there are at least two methods to achieve it: (1) one is to pass a pointer-to-pointer parameter, like: int my_malloc(int size, char **pmem) { *pmem=(char *)malloc(size); if(*pmem==NULL)... (11 Replies)
Discussion started by: aaronwong
11 Replies

6. UNIX for Dummies Questions & Answers

void (char *asd)

void asdf(char *asd) is this thing a pointer? (1 Reply)
Discussion started by: khestoi
1 Replies

7. Programming

What is the difference between f(...), f(void) and f()

What is the difference between f(...) , f(void),f() I know that f(void) doesn't take any parameters, but what about f() and f(...) Does the last call of function even exists? (2 Replies)
Discussion started by: purplelightspar
2 Replies

8. Programming

How to return void function pointer

Hello all im trying to build function that will return void function pointer what is mean is ( not working ) the main function void * myClass::getFunction(int type){ if(type==1) return &myClass::Test1; if(type==2) return &myClass::Test2; } void myClass::Test1(){... (1 Reply)
Discussion started by: umen
1 Replies

9. Shell Programming and Scripting

Sorting the Void File in CSH

First and foremost, this is not a homework for your information. I'm just new to using c-shell programming and I just wanted to make my life easier @ work. Say, the file contains the following: ID FILE NO. SL VP 1 1 22 33 1 2 ... (3 Replies)
Discussion started by: ilak1008
3 Replies

Featured Tech Videos