Passing char pointer in C
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 * .
Sarp Kaya
Updated on July 09, 2022Comments
-
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 over 11 yearsI would have prefered to return the pointer rather than another level of indirection, but +1 nonetheless
-
Sarp Kaya over 11 yearsWhich way is less expensive?
-
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 over 8 yearsThis will trigger a warning of local variables if you do not hardcode the return value as a string literal.
-
TomSawyer about 4 yearswhy we need const here?
-
TomSawyer about 4 yearswhy 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?