• +91 9971497814
  • info@interviewmaterial.com

C Interview Questions Answers

Question 1 :  I had the definition char a[6] in one source file, and in another I declared extern char *a. Why didn't it work?

Answer 1 : In one source file you defined an array of characters and in the other you declared a pointer to characters. The declaration extern char *a does not declare an array and therefore does not match the actual definition. The type pointer-to-type-T is not the same as array-of-type-T. Use extern char a[].

Question 2 : what is meant by the ``equivalence of pointers and arrays'' in C?

Answer 2 : Much of the confusion surrounding arrays and pointers in C can be traced to a misunderstanding of this statement. Saying that arrays and pointers are ``equivalent'' means neither that they are identical nor even interchangeable. What it means is that array and pointer arithmetic is defined such that a pointer can be conveniently used to access an array or to simulate an array. In other words, as Wayne Throop has put it, it's ``pointer arithmetic and array indexing [that] are equivalent in C, pointers and arrays are different.'') Specifically, the cornerstone of the equivalence is this key definition: A reference to an object of type array-of-T which appears in an expression decays (with three exceptions) into a pointer to its first element; the type of the resultant pointer is pointer-to-T.   That is, whenever an array appears in an expression, the compiler implicitly generates a pointer to the array's first element, just as if the programmer had written &a[0]. (The exceptions are when the array is the operand of a sizeof or & operator, or is a string literal initializer for a character array. As a consequence of this definition, and in spite of the fact that the underlying arrays and pointers are quite different, the compiler doesn't apply the array subscripting operator [] that differently to arrays and pointers, after all. Given an array a and pointer p, an expression of the form a[i] causes the array to decay into a pointer, following the rule above, and then to be subscripted just as would be a pointer variable in the expression p[i] .If you were to assign the array's address to the pointer: p = a; then p[3] and a[3] would access the same element.

Question 3 : Why can't I do something like this? extern char *getpass(); char str[10]; str = getpass("Enter password: ");

Answer 3 : Arrays are ``second-class citizens'' in C; one upshot of this prejudice is that you cannot assign to them . When you need to copy the contents of one array to another, you must do so explicitly. In the case of char arrays, the strcpy routine is usually appropriate: strcpy(str, getpass("Enter password: "));   (When you want to pass arrays around without copying them, you can use pointers and simple assignment)

Question 4 : what about this? Isn't this an array assignment? char a[] = "Hello, world!\n";

Answer 4 : No, that's an initialization. You are allowed to initialize arrays when you define them.

Question 5 :  What is C language?

Answer 5 : 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. ...

Question 6 : printf() Function What is the output of printf("%d")?

Answer 6 : 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(...).

Question 7 : malloc() Function- What is the difference between "calloc(...)" and "malloc(...)"?

Answer 7 : 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.

Question 8 : printf() Function- What is the difference between "printf(...)" and "sprintf(...)"?

Answer 8 : sprintf(...) writes data to the character array whereas printf(...) writes data to the standard output device.

Question 9 : Compilation How to reduce a final size of executable?

Answer 9 : Size of the final executable can be reduced using dynamic linking for libraries.

Question 10 : Linked Lists -- Can you tell me how to check whether a linked list is circular?

Answer 10 : 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.

C Contributors

krishan

Share your email for latest updates

Name:
Email:

Our partners