C Interview Questions With Answers
******************************************
There is a large collection of interview Questions Which has been asked in Interview to the students...
There is a large collection of interview Questions Which has been asked in Interview to the students...
What is C language?
The C programming language is a standardized programming language
developed in the early 1970s by Ken Thompson and Dennis Ritchie for
use on the UNIX operating system. It has since spread to many other
operating systems, and is one of the most widely used programming
languages. C is prized for its efficiency, and is the most popular
programming language for writing system software, though it is also
used for writing applications.
developed in the early 1970s by Ken Thompson and Dennis Ritchie for
use on the UNIX operating system. It has since spread to many other
operating systems, and is one of the most widely used programming
languages. C is prized for its efficiency, and is the most popular
programming language for writing system software, though it is also
used for writing applications.
printf() Function
2. When we use %d the compiler internally uses it to access the
argument in the stack (argument stack). Ideally compiler determines
the offset of the data variable depending on the format specification
string. Now when we write printf("%d",a) then compiler first accesses
the top most element in the argument stack of the printf which is %d
and depending on the format string it calculated to offset to the actual
data variable in the memory which is to be printed. Now when only %d
will be present in the printf then compiler will calculate the correct
offset (which will be the offset to access the integer variable) but as
the actual data object is to be printed is not present at that memory
location so it will print what ever will be the contents of that memory
location.
3. Some compilers check the format string and will generate an error
without the proper number and type of arguments for things like
printf(...) and scanf(...).
malloc() Function-What is the output of printf("%d")?
Ans.
1. When we write printf("%d",x); this means compiler will print the
value of x. But as here, there is nothing after %d so compiler will show in output window garbage value.
2. When we use %d the compiler internally uses it to access the
argument in the stack (argument stack). Ideally compiler determines
the offset of the data variable depending on the format specification
string. Now when we write printf("%d",a) then compiler first accesses
the top most element in the argument stack of the printf which is %d
and depending on the format string it calculated to offset to the actual
data variable in the memory which is to be printed. Now when only %d
will be present in the printf then compiler will calculate the correct
offset (which will be the offset to access the integer variable) but as
the actual data object is to be printed is not present at that memory
location so it will print what ever will be the contents of that memory
location.
3. Some compilers check the format string and will generate an error
without the proper number and type of arguments for things like
printf(...) and scanf(...).
What is the difference between "calloc(...)" and
"malloc(...)"?
1. calloc(...) allocates a block of memory for an array of elements of a
certain size. By default the block is initialized to 0. The total number of
memory allocated will be (number_of_elements * size).
malloc(...) takes in only a single argument which is the memory
required in bytes. malloc(...) allocated bytes of memory and not blocks
of memory like calloc(...).
2. malloc(...) allocates memory blocks and returns a void pointer to the
allocated space, or NULL if there is insufficient memory available.
calloc(...) allocates an array in memory with elements initialized to 0
and returns a pointer to the allocated space. calloc(...) calls malloc(...)
in order to use the C++ _set_new_mode function to set the new
handler mode.
() Function-
What is the difference between "printf(...)" and "sprintf(...)"?
sprintf(...) writes data to the character array whereas
printf(...) writes data to the
standard output device.
Compilation How to reduce a final size of executable?
Size of the final executable can be reduced using dynamic linking for
libraries.
Linked Lists --
Can you tell me how to check whether a linked list is circular?
Create two pointers, and set both to the start of the list. Update each
as follows:
while (pointer1) {
pointer1 = pointer1->next;
pointer2 = pointer2->next;
if (pointer2) pointer2=pointer2->next;
if (pointer1 == pointer2) {
print ("circular");
}}
If a list is circular, at some point pointer2 will wrap around and be either at the item just before pointer1, or the item before that. Either way, its either 1 or 2 jumps until they meet.
"union" Data Type
What is the output of the following program? Why?
#include
main()
{
typedef union {
int a;
char b[10];
float c;
}
Union;
Union x,y = {100};
x.a = 50;
strcpy(x.b,"hello");
x.c = 21.50;
printf("Union x : %d %s %f n",x.a,x.b,x.c);
printf("Union y : %d %s %f n",y.a,y.b,y.c);
}
What does
static variable mean?
there
are 3 main uses for the static.
1. If you declare within a function:
It retains the value between function
calls
2.If it is declared for a function
name:
By default function is extern..so it will be visible
from other files if the
function declaration is as static..it is invisible
for the outer files
3. Static for global variables:
By default we can use the global variables from
outside files If it is
static global..that variable is limited to with in the file
Macro gets to see the Compilation
environment, so it can expand __
__TIME__ __FILE__ #defines. It is expanded by the preprocessor.
__TIME__ __FILE__ #defines. It is expanded by the preprocessor.
For example, you can’t do this without
macros
#define PRINT(EXPR) printf( #EXPR “=%d\n”, EXPR)
PRINT( 5+6*7 ) // expands into printf(”5+6*7=%d”, 5+6*7 );
You can define your mini language with macros:
#define PRINT(EXPR) printf( #EXPR “=%d\n”, EXPR)
PRINT( 5+6*7 ) // expands into printf(”5+6*7=%d”, 5+6*7 );
You can define your mini language with macros:
#define strequal(A,B) (!strcmp(A,B))
Macros are a necessary evils of life. The purists don’t like them, but
without it no real work gets done.
Macros are a necessary evils of life. The purists don’t like them, but
without it no real work gets done.
What are the differences between malloc() and calloc()?
There are 2 differences.
First, is in the number of arguments. malloc() takes a single
argument(memory required in bytes), while calloc() needs 2
arguments(number of variables to allocate memory, size in bytes of a
single variable).
Secondly, malloc() does not initialize the memory allocated, while
calloc() initializes the allocated memory to ZERO.
What are the different
storage classes in C?
C has three types of storage:
automatic, static and allocated.
Variable having block scope and without static specifier have
automatic storage duration.
Variables with block scope, and with static specifier have static scope.
Global variables (i.e, file scope) with or without the static specifier also
have static scope.
Memory obtained from calls to malloc(), alloc() or realloc() belongs to
allocated storage class.
Variable having block scope and without static specifier have
automatic storage duration.
Variables with block scope, and with static specifier have static scope.
Global variables (i.e, file scope) with or without the static specifier also
have static scope.
Memory obtained from calls to malloc(), alloc() or realloc() belongs to
allocated storage class.
What is the difference
between strings and character arrays?
A major difference is: string will have static storage duration, whereas
as a character array will not, unless it is explicity specified by using the
static keyword.
Actually, a string is a character array with following properties:
* the multibyte
character sequence, to which we generally call string,
is used to initialize an array of static storage duration. The size of this
array is just sufficient to contain these characters plus the terminating
NUL character.
* it not specified what happens if this array, i.e., string, is modified.
* Two strings of same value[1] may share same memory area. For
example, in the following declarations:
char *s1 = “Calvin and Hobbes”;
char *s2 = “Calvin and Hobbes”;
the strings pointed by s1 and s2 may reside in the same memory
location. But, it is not true for the following:
char ca1[] = “Calvin and Hobbes”;
char ca2[] = “Calvin and Hobbes”;
[1] The value of a string is the sequence of the values of the contained
characters, in order.
is used to initialize an array of static storage duration. The size of this
array is just sufficient to contain these characters plus the terminating
NUL character.
* it not specified what happens if this array, i.e., string, is modified.
* Two strings of same value[1] may share same memory area. For
example, in the following declarations:
char *s1 = “Calvin and Hobbes”;
char *s2 = “Calvin and Hobbes”;
the strings pointed by s1 and s2 may reside in the same memory
location. But, it is not true for the following:
char ca1[] = “Calvin and Hobbes”;
char ca2[] = “Calvin and Hobbes”;
[1] The value of a string is the sequence of the values of the contained
characters, in order.
Difference
between const char* p and char const* p?
In const char* p, the character pointed by ‘p’ is constant, so u
cant
change the value of character pointed by p but u can make ‘p’
refer to
some other location.
in char const* p, the ptr ‘p’ is constant not the character
referenced by
it, so u cant make ‘p’ to reference to any other location but u
can
change the value of the char pointed by ‘p’.
What is
hashing?
To hash means to grind up, and that’s essentially what hashing
is all
about. The heart of a hashing algorithm is a hash function that
takes
your nice, neat data and grinds it into some random-looking
integer.
The idea behind hashing is that some data either has no inherent
ordering (such as images) or is expensive to compare (such as
images). If the data has no inherent ordering, you can’t perform
comparison searches.
If the data is expensive to compare, the number of comparisons
used even by a binary search might be too many. So instead of looking at
the data themselves, you’ll condense (hash) the data to an integer
(its
hash value) and keep all the data with the same hash value in the
same place. This task is carried out by using the hash value as an
index into an array.
To search for an item, you simply hash it and look at all the data
whose
hash values match that of the data you’re looking for. This
technique
greatly lessens the number of items you have to look at. If the
parameters are set up with care and enough storage is available
for
the hash table, the number of comparisons needed to find an item
can
be made arbitrarily close to one.
One aspect that affects the efficiency of a hashing implementation
is
the hash function itself. It should ideally distribute data
randomly
throughout the entire hash table, to reduce the likelihood of
collisions.
Collisions occur when two different keys have the same hash value.
There are two ways to
resolve this problem. In open addressing, the
collision is resolved by the choosing of another position in the
hash
table for the element inserted later. When the hash table is
searched, if
the entry is not found at its hashed position in the table, the
search
continues checking until either the element is found or an empty
position in the table is found.
The second method of resolving a hash collision is called
chaining. In
this method, a bucket or linked list holds all the elements whose
keys
hash to the same value. When the hash table is searched, the list
must
be searched linearly.
How can you determine the
size of an allocated portion of memory?
You can’t, really. free() can , but there’s
no way for your program to
know the trick free() uses. Even if you disassemble the library
and
discover the trick, there’s no guarantee the
trick won’t change with the
next release of the compiler.
Can
static variables be declared in a
header file?
You can’t declare a static variable
without defining it as well (this is
because the storage class modifiers
static and extern are mutually
exclusive). A static variable
can be defined in a header file, but this
would cause each source file that included the header file to have
its own private copy of the variable, which is probably
not what was
intended.
Can a
variable be both const and volatile?
Yes. The const modifier means that this code cannot change the
value
of the variable, but that does
not mean that the value cannot be
changed by means outside this code. For instance, in the example
in
FAQ 8, the timer structure was accessed through a volatile const
pointer. The function itself did not change the value of the
timer, so it
was declared const. However, the value was changed by hardware on
the computer, so it was declared volatile. If a
variable is both const and
volatile, the two modifiers can appear in either order.





