1

I have just started off with C socket programming. I have read that 0 as an integer constant, refers to a null pointer when compared with a pointer and '\0' refers to a null character, something that sets all the bits to 0. And, in the case concerning my question, I know I should probably be using '\0'. But I can see a lot of implementations that uses 0 instead. What would be the difference as such? I don't wanna go with whatever that works. I can't move on till I understand why. Thanks!

Manic
  • 103
  • 1
  • 8
  • 1
    Possible duplicate of [What is value of EOF and '\0' in C](https://stackoverflow.com/questions/4705968/what-is-value-of-eof-and-0-in-c) – CS Pei Oct 01 '17 at 01:53

5 Answers5

2

There is no difference. They are equal.

bezet
  • 810
  • 7
  • 13
  • Okay. Thanks. Um, but 0 and '\0' are inherently different, right? Would it be possible to give a brief explanation as to why they are equal here? – Manic Oct 01 '17 at 01:45
  • They are always equal. That's just another way of representing the same thing, so that you can use it inside a string literal like so: `char c[] = "a\0b\0c";`. You could write it like `char c[] = {'a', 0, 'b', 0, 'c'}`. It will be exactly the same. – bezet Oct 01 '17 at 01:48
  • The character '0' is integer 48. Whereas the character '\0' is the integer 0. – Questionable Oct 01 '17 at 02:30
2

There will be absolutely no difference. Please use 0 since you zeroise memory and you don't want to underscore any nature of the memory like you would do, say, when comparing either element of a char array with '\0' to denote that you are looking for a null character.

To be more precise, ' ' is an expression which gives an integer constant which corresponds to the character specified. In this particular case, '\0' evaluates to the same integer - 0. So, no difference.

2

They are equivalent.

But it is common to use 0 when working with integers, and '\0' when dealing with characters or bytes:

int n = 0;
char ch = '\0';

For pointers use NULL macro.

memset has following prototype:

void * memset ( void * ptr, int value, size_t num );

Although value has int type, it is being interpreted as byte value. So there is no difference.

boriaz50
  • 860
  • 4
  • 17
2

In C, character literals such as 'x' have type int, which means '\0' and 0 are not just numerically equal, they are 100% equivalent semantically. They are two different spellings of the same integer constant. You can only tell the difference using a construct that inspects the spelling of tokens, such as the preprocessor's # and ## operators.

(Yes, this means '\0' is a null pointer constant.)

zwol
  • 135,547
  • 38
  • 252
  • 361
1

char is an integer type, it means that the characters you can use with the simple quotes like 'a' are in reality integer values. I invite you to look for the ascii, you'll see the link between characters and integers. You can do some easy tests with printf() :

printf("%c == %d == %c\n", 'A', 'A', 65);

You'll notice that the character '\0' has the integer value 0, so there is no difference, you can use 0 or '\0' in your code, for the compiler it's the same thing. Usually, NULL is a macro for (void *) 0 wich is the value 0 casted into generic pointer (it's still the value 0, but it will be interpreted as a pointer type).

Gam
  • 684
  • 1
  • 8
  • 17