C interview Questions

#include
void main()
{
      struct xx
      {
            int x;
            struct yy
            {
                  char s;
                  struct xx *p;
            };
            struct yy *q;
      };
}

Answer:
     Compiler Error
Explanation:
     in the end of nested structure yy a member have to be declared.

void main()
{
       extern int i;
      i=20;
      printf("%d",sizeof(i));
}

Answer:
     Linker error: undefined symbol '_i'.
Explanation:
     extern declaration specifies that the variable i is defined somewhere else. The compiler passes the external variable to be resolved by the linker. So compiler doesn't find an error. During linking the linker searches for the definition of i. Since it is not found the linker flags an error.

void main()
{
      printf("%d", out);
}
int out=100;

Answer:
     Compiler error: undefined symbol out in function main.
Explanation:
     The rule is that a variable is available for use from the point of declaration. Even though a is a global variable, it is not available for main. Hence an error.

void main()
{
       extern out;
      printf("%d", out);
}
int out=100;

Answer:
     100
Explanation:
     This is the correct way of writing the previous program.

void main()
{
      show();
}
void show()
{
      printf("I'm the greatest");
}

Answer:
     Compier error: Type mismatch in redeclaration of show.
Explanation:
     When the compiler sees the function show it doesn't know anything about it. So the default return type (ie, int) is assumed. But when compiler sees the actual definition of show mismatch occurs since it is declared as void. Hence the error.
The solutions are as follows:
     1. declare void show() in main() .
     2. define show() before main().
     3. declare extern void show() before the use of show().

void main()
{
      int a[ ] = {10,20,30,40,50},j,*p;
      for(j=0; j<5; j++)
      {
            printf(“%d” ,*a);
            a++;
      }
      p = a;
      for(j=0; j<5; j++)
      {
            printf(“%d ” ,*p);
            p++;
      }
}

Answer:
     Compiler error: lvalue required.
Explanation:
     Error is in line with statement a++. The operand must be an lvalue and may be of any of scalar type for the any operator, array name only when subscripted is an lvalue. Simply array name is a non-modifiable lvalue.

void main()
{
      void *vp;
      char ch = ‘g’, *cp = “goofy”;
       int j = 20;
       vp = &ch;
       printf(“%c”, *(char *)vp);
      vp = &j;
      printf(“%d”,*(int *)vp);
      vp = cp;
      printf(“%s”,(char *)vp + 3);
}

Answer:
     g20fy
Explanation:
     Since a void pointer is used it can be type casted to any other type pointer. vp = &ch stores address of char ch and the next statement prints the value stored in vp after type casting it to the proper data type pointer. the output is ‘g’. Similarly the output from second printf is ‘20’. The third printf statement type casts it to print the string from the 4th value hence the output is ‘fy’.

void main()
{
       static char *s[ ] = {“black”, “white”, “yellow”, “violet”};
       char **ptr[ ] = {s+3, s+2, s+1, s}, ***p;
       p = ptr;
       **++p;
       printf(“%s”,*--*++p + 3);
}

Answer:
     ck
Explanation:
     In this problem we have an array of char pointers pointing to start of 4 strings. Then we have ptr which is a pointer to a pointer of type char and a variable p which is a pointer to a pointer to a pointer of type char. p hold the initial value of ptr, i.e. p = s+3. The next statement increment value in p by 1 , thus now value of p = s+2. In the printf statement the expression is evaluated *++p causes gets value s+1 then the pre decrement is executed and we get s+1 – 1 = s . the indirection operator now gets the value from the array of s and adds 3 to the starting address. The string is printed starting from this position. Thus, the output is ‘ck’.

void main()
{
       int i, n;
      char *x = “girl”;
      n = strlen(x);
      *x = x[n];
      for(i=0; i       {
            printf(“%s\n”,x);
            x++;
      }
}

Answer:
     (blank space)
     irl
     rl
     l
Explanation:
     Here a string (a pointer to char) is initialized with a value “girl”. The strlen function returns the length of the string, thus n has a value 4. The next statement assigns value at the nth location (‘\0’) to the first location. Now the string becomes “\0irl” . Now the printf statement prints the string after each iteration it increments it starting position. Loop starts from 0 to 4. The first time x[0] = ‘\0’ hence it prints nothing and pointer value is incremented. The second time it prints from x[1] i.e “irl” and the third time it prints “rl” and the last time it prints “l” and the loop terminates.

int i,j;
for(i=0;i<=10;i++)
{
     j+=5;
     assert(i<5);
}

Answer:
     Runtime error: Abnormal program termination.
     assert failed (i<5), file name, line number

Explanation:
     asserts are used during debugging to make sure that certain conditions are satisfied. If assertion fails, the program will terminate reporting the same. After debugging use,
          #undef NDEBUG
     and this will disable all the assertions from the source code. Assertion is a good debugging tool to make use of.

Google