if I have as an argument int **a in my function
I was wondering what is the difference between a = (int **)malloc(sizeof(a)*(length) and *a = (int *)malloc(sizeof(a)*(length)
I've discovered malloc last week so I don't understand everything yet.
Thank you ! 
 
    
    - 115
- 2
- 11
- 
                    2With `int **a`, ask "what is the difference between `a` and `*a`?" – chux - Reinstate Monica Aug 21 '18 at 13:28
- 
                    3Note that `sizeof(a)` is unlikely to be what you want in either case. What you want instead depends on which variant you choose. – John Bollinger Aug 21 '18 at 13:29
- 
                    1If you just now are learning this, you might want to get it right from the start: [Correctly allocating multi-dimensional arrays](https://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays). Otherwise some poor soul has to spend time deprogramming you, when you become a professional programmer. – Lundin Aug 21 '18 at 13:55
4 Answers
malloc just returns a void * pointer, nothing more.
a is a pointer to pointer. 
The right side of the Equals Sign is not important here, so leave the right side alone. Now we got:
// 1st code fragment
int **a1;
// Asign a null pointer to a1, now a1 is a NULL pointer
a1 = (int **)NULL;
// 2rd code fragment
int **a2;
// Asign a null pointer to the pointer pointed by a2.
// Here may crash actually, because a2 is not initialized yet.
*a2 = (int *)NULL;
 
    
    - 1,129
- 11
- 27
The first case takes the address of the memory allocated by the call to malloc, and assigns it to your variable a.
The second takes the address of the memory allocated by malloc and stores that in whatever memory a happens to be pointing at.
There's another question here, though, which is specifying how much memory you should allocate. If you want a to store an array of pointers to integers, I would use expression a = (int**) malloc( length * sizeof(*a) ); which makes it clear that you are allocating space for a number of integer pointers.
On the other hand, if you want to allocate space for a number of integers (not pointers) and you are sure that a is pointing at a variable of type int*, then use the expression *a = (int*) malloc( length * sizeof *(*a) );
Finally, note that (per chux's link below) it is unnecessary and not recommended to cast the result of malloc(). I have left in the casts here only for clarity, because they illustrate that we're storing the returned value in a different type of variable in each case.
 
    
    - 4,040
- 1
- 17
- 39
- 
                    2If code uses `a = malloc(sizeof *a * length);` then, coding the type is not needed as in `a = (int**) malloc( length * sizeof(int*) );`. Easier to code right, review and maintain. – chux - Reinstate Monica Aug 21 '18 at 13:37
- 
                    Good point, chux, but I'm still not sure whether the user wanted to allocate integers or pointers – Tim Randall Aug 21 '18 at 13:40
- 
                    1In the 2nd case, code can use `*a = malloc(sizeof *(*a) * length);` instead of `*a = (int*) malloc( length * sizeof(int) );`. Again, the type does not need to be coded here. – chux - Reinstate Monica Aug 21 '18 at 13:43
- 
                    1You may enjoy [Do I cast the result of malloc?](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – chux - Reinstate Monica Aug 21 '18 at 13:46
- 
                    
int **a;
a is of type integer double pointer.
a = (int **) malloc(sizeof(a)*(length));
uninitialized memory of size sizeof(a)*(length) allocated to a upon malloc success.
*a = (int )malloc(sizeof(a)(length);
uninitialized memory of size sizeof(a)*(length) allocated to a[0] (if a initialized only other wise it crashes) upon malloc success.
Note: sizeof(a) is sizeof double pointer, it is 4 bytes for 32 bit mechine. So allocating 
same memory i.e sizeof(a)*(length) memory in both cases may not be correct.
 
    
    - 180
- 13
I think the following will answer your question, but I am not 100% sure. Let's find out!
You mention 'my function', which makes me think that you are not referring to your main function, but that you are writing a function (perhaps to allocate a). If that is the case, the difference is the following; a simple variable int a in the argument list of a function will be passed by value. That means that if you call the function, say void foo(int x), with a certain value, that value will be copied to the function. Therefore, when you enter the function, you are not working with the actual variable; instead, you are working with a copy. Where a particular variable exists and where it does not, is referred to as a variable's scope.
Now to your practical case: I presume you want to allocate an array in a function. If you use your first example:
a = (int **)malloc(sizeof(a)*(length) in a function where a is an argument, the same thing will happen as I outlined above. I.e., a gets copied to the function and then you allocate it there. However, when your function ends, a is destroyed (note: the pointer that is, the memory is not freed correctly)! If my assumption is correct, this will probably not be the desired result.
By contract, if your function has int *a as an argument, the argument will be passed by  address. Now, any changes you make (by dereferencing a using the * operator), will persist even when you return to the place where your function was called.
 
    
    - 508
- 2
- 9
- 
                    
- 
                    2C++ examples are not particularly welcome in questions tagged [c], your assertion of relevance notwithstanding. Beyond that, although scope may indeed be relevant to the OP's situation, it is not directly relevant to the actual question. – John Bollinger Aug 21 '18 at 13:53
- 
                    Good points, I'll remove the example and leave the last two paragraphs. – Floris Aug 21 '18 at 13:56