views:

487

answers:

5
#include <stdio.h>
#include <stdlib.h>

void
getstr(char *&retstr)
{
 char *tmp = (char *)malloc(25);
 strcpy(tmp, "hello,world");
 retstr = tmp;
}

int
main(void)
{
 char *retstr;

 getstr(retstr);
 printf("%s\n", retstr);

 return 0;
}

gcc would not compile this file,but after adding #include <cstring> I could use g++ to compile this source file.

The problem is does the C programming language support passing pointer argument by reference?If not why?

thanks.

+13  A: 

No, C doesn't support references. It is by design. Instead of references you could use pointer to pointer in C. References are available only in C++ language.

Kirill V. Lyadvinsky
+2  A: 
PP
Don't cast the return value of `malloc`. It can hide a failure to `#include <stdlib.h>` (which you did forget in the code above). See http://c-faq.com/malloc/mallocnocast.html Also, don't forget to check the return value of `malloc`.
Sinan Ünür
Wow, some people struggle to see the difference between a proof of concept test routine and production code! It was obvious this was a rough-and-ready test routine because there was no corresponding `free` but I guess some people miss the obvious!
PP
+6  A: 

References are a feature of C++, while C supports only pointers. To have your function modify the value of the given pointer, pass pointer to the pointer:

void getstr(char ** retstr)
{
    char *tmp = (char *)malloc(25);
    strcpy(tmp, "hello,world");
    *retstr = tmp;
}

int main(void)
{
    char *retstr;

    getstr(&retstr);
    printf("%s\n", retstr);

    // Don't forget to free the malloc'd memory
    free(retstr);

    return 0;
}
Bojan Resnik
Don't cast what `malloc()` returns. If you've included `stdlib.h`, it does absolutely nothing. If you haven't, it hides that fact.
David Thornley
As `malloc` returns `void*` I find it good practice to cast it explicitly to the required type instead of relying on implicit conversions. If `stdlib.h` is not included, casting doesn't hide that fact - the compiler will warn you that `malloc` has not been declared.
Bojan Resnik
A: 

C lang does not have reference variables but its part of C++ lang.

The reason of introducing reference is to avoid dangling pointers and pre-checking for pointers nullity.

You can consider reference as constant pointer i.e. const pointer can only point to data it has been initialized to point.

Ashish
The other difference (besides the syntactic ones) is that references cannot be null.
David Thornley
A: 

This should be a comment but it is too long for a comment box, so I am making it CW.

The code you provided can be better written as:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void
getstr(char **retstr)
{
    *retstr = malloc(25);
    if ( *retstr ) {
        strcpy(*retstr, "hello,world");
    }
    return;
}

int
main(void)
{
    char *retstr;

    getstr(&retstr);
    if ( retstr ) {
        printf("%s\n", retstr);
    }
    return 0;
}
Sinan Ünür