char *s1 = "";
char *s2 = NULL;
I just want to know the difference
CodePudding user response:
One is pointing to the first element of an array of a single char element, the element being the string null-terminator character '\0'.
The other variable is initialized point to NULL which means it doesn't point anywhere, really.
Slightly simplified, the definition
char *s1 = "";
is kind of equivalent to
char private_array[1] = { '\0' };
char *s1 = &private_array[0];
It might seem confusing to have both a string null terminator, and a generic null pointer, but it will clear itself out with more experience.
Also note that in C all literal strings (even "") are not modifiable, they are in essence read only. That's why it's recommended to always use const char * to point to literal strings.
CodePudding user response:
There's a very big differnce using "" leaves '\0', whereas NULL leaves the pointer as ((void *)0).
This can be tested via dereferencing the pointer like:
NOTE: Dereferencing the pointer means accessing its inner values or elements, which is done using * unary operator or [] operator in C/C .
""
#include <stdio.h>
int main(void){
char *s1 = "";
printf("%d", *s1);
return 0;
}
I'm printing the integer representation of *s1 because '\0' can't be seen on the terminal.
Ouput:
0
And program returned 0 which means success.
NULL
#include <stdio.h>
int main(void){
char *s2 = NULL;
printf("%d", *s2);
return 0;
}
The above program printed nothing on stdout, but it returned 139, which means program crashed before it exited (segmentation fault).
You can try it online.
CodePudding user response:
An empty string has a single element, the null character, '\0'. That’s still a character, and the string has a length of zero, but it’s not the same as a NULL, which has no characters at all.
