Answer: Let’s recall, firstly, concept of sizeof operator and strlen() functions before we implement them with character arrays or strings.
sizeof operator returns amount of memory allocated, in bytes, of the argument passed to it. It works with string as well as with non-string data. In particular, it works with any type of data. While strlen function works only with character strings. Undefined results when ‘Non-String’ data is passed to strlen. Let’s consider a C program to unravel the behaviour of these two functions.
Let’s write a C program to test working of sizeof and strlen functions with arrays and strings, for example:
/* * diff_sizeof_strlen.c -- program shows differences between using sizeof * and strlen with arrays and strings */ #include <stdio.h> #include <string.h> int main(void) { char char_arr[100] = {0}; /* 'char_arr' array string declared */ char str[100] = "strlen returns actual no. of characters in the string" " but NULL byte"; int ranking[50]; /* 'ranking' an array of 50 integers */ float avg_marks[10]; /* 'avg_marks' an array of 10 floats */ char *str_lit = "I'm string literal declared and initialized using " "ptr-to-char"; puts("\n**Program differentiates use of sizeof and strlen with arrays " "and strings**\n"); puts("\nUsing sizeof...\n"); printf("Amount of mem. allocated to \"char char_arr[100]\" is %d " "bytes.\n", sizeof(char_arr)); printf("Amount of mem. allocated to \"char str[100]\" is %d bytes.\n", sizeof(str)); printf("Amount of mem. allocated to \"int ranking[50]\" is %d bytes." "\n", sizeof(ranking)); printf("Amount of mem. allocated to \"float avg_marks[10]\" is %d " "bytes.\n", sizeof(avg_marks)); printf("Amount of mem. allocated to \"char *str_lit\" is %d bytes.\n", sizeof(str_lit)); puts("\nUsing strlen...\n"); printf("No. of characters returned in \"char char_arr[100]\" is %d." "\n", strlen(char_arr)); printf("No. of characters returned in \"char str[100]\" is %d.\n", strlen(str)); printf("No. of characters returned in \"int ranking[50]\" is %d.\n", strlen(ranking)); printf("No. of characters returned in \"float avg_marks[10]\" is %d." "\n", strlen(avg_marks)); printf("No. of characters returned in \"char *str_lit\" is %d.\n", strlen(str_lit)); puts(""); return 0; }
When above program compiled with warnings enabled, result is,
sizeof_stlen.c: In function ‘main’: sizeof_stlen.c:23:2: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default] /usr/include/string.h:399:15: note: expected ‘const char *’ but argument is of type 'int *’ sizeof_stlen.c:24:2: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default] /usr/include/string.h:399:15: note: expected ‘const char *’ but argument is of type ‘float *’
and when run with warnings allowed, resulted as:
**Program differentiates use of sizeof and strlen with arrays and strings** Using sizeof... Amount of mem. allocated to "char char_arr[100]" is 100 bytes. Amount of mem. allocated to "char str[100]" is 100 bytes. Amount of mem. allocated to "int ranking[50]" is 200 bytes. Amount of mem. allocated to "float avg_marks[10]" is 40 bytes. Amount of mem. allocated to "char *str_lit" is 8 bytes. Using strlen... No. of characters returned in "char char_arr[100]" is 0. No. of characters returned in "char str[100]" is 66. No. of characters returned in "int ranking[50]" is 5. No. of characters returned in "float avg_marks[10]" is 6. No. of characters returned in "char *str_lit" is 61.
Analysing the output below,
Function strlen has prototype as:
size_t strlen(char const*);
that is it handles character strings only. Further, it returns actual no. of characters in the string not counting on NULL. Notice char_arr[100] = {0} is allocated 100 bytes but returns 0 characters.
Sanfoundry Global Education & Learning Series – 1000 C Tutorials.
- Check C Books
- Practice BCA MCQs
- Apply for Computer Science Internship
- Watch Advanced C Programming Videos
- Practice Computer Science MCQs