Passing char pointer in C

63,794

Solution 1

void ptrch ( char * point) {
    point = "asd";
}

Your pointer is passed by value, and this code copies, then overwrites the copy. So the original pointer is untouched.

P.S. Point to be noted that when you do point = "blah" you are creating a string literal, and any attempt to modify is Undefined behaviour, so it should really be const char *

To Fix - pass a pointer to a pointer as @Hassan TM does, or return the pointer as below.

const char *ptrch () {
    return "asd";
}

...
const char* point = ptrch();

Solution 2

This should work since pointer to the char pointer is passed. Therefore any changes to the pointer will be seen outside thereafter.

void ptrch ( char ** point) {
    *point = "asd";
}

int main() {
    char * point;
    ptrch(&point);
    printf("%s\n", point);
    return 0;
}

Solution 3

Here:

int main() { char * point; ptrch(point);

You're passing point by value. Then, ptrch sets its own local copy of point to point to "asd", leaving the point in main untouched.

A solution would be to pass a pointer to main's point:

void ptrch(char **pp) { *pp = "asd"; return; }

Solution 4

If you change the value of the pointer in a function, it will remain changed only in that one function call. Don't mess your head with pointers and try:

void func(int i){
  i=5;
}
int main(){
  int i=0;
  func(i);
  printf("%d\n",i);
  return 0;
}

The same with your pointer. You do not change the address it points to.

If you assign to a variable passed by value, the variable outside the function will remain unchanged. You could pass it by a pointer (to pointer) and change it by dereferrencing it and it's the same with an int - in this case, it doesn't matter if the type is int or char * .

Share:
63,794
Sarp Kaya
Author by

Sarp Kaya

Updated on July 09, 2022

Comments

  • Sarp Kaya
    Sarp Kaya almost 2 years

    Okay so I am trying to pass a char pointer to another function. I can do this with an array of a char but cannot do with a char pointer. Problem is I don't know the size of it so I cannot declare anything about the size within the main() function.

    #include <stdio.h>
    
    void ptrch ( char * point) {
        point = "asd";
    }
    
    int main() {
        char * point;
        ptrch(point);
        printf("%s\n", point);
        return 0;
    }
    

    This does not work however, these two works:

    1)

    #include <stdio.h>
    
    int main() {
        char * point;
        point = "asd";
        printf("%s\n", point);
        return 0;
    }
    

    2)

    #include <stdio.h>
    #include <string.h>
    
    void ptrch ( char * point) {
        strcpy(point, "asd");
    }
    
    int main() {
        char point[10];
        ptrch(point);
        printf("%s\n", point);
        return 0;
    }
    

    So I am trying to understand the reason and a possible solution for my problem

  • Karthik T
    Karthik T over 11 years
    I would have prefered to return the pointer rather than another level of indirection, but +1 nonetheless
  • Sarp Kaya
    Sarp Kaya over 11 years
    Which way is less expensive?
  • Karthik T
    Karthik T over 11 years
    @SarpKaya both are blazingly fast (difference would be minimal if any), but I would prefer the "return the pointer" method for readability.
  • Zimano
    Zimano over 8 years
    This will trigger a warning of local variables if you do not hardcode the return value as a string literal.
  • TomSawyer
    TomSawyer about 4 years
    why we need const here?
  • TomSawyer
    TomSawyer about 4 years
    why it works with integer and doesn't need to pass pointer to pointer? i think because after dereference, char pointer remain is the address of first element of array?