C-Interview Questions level 10
Q1) What does the error "Null Pointer Assignment" mean and what causes this error?
Answer:- The Null Pointer Assignment error is generated only in small and medium memory models. This error occurs in programs which attempt to change the bottom of the data segment. In Borland's C or C++ compilers, Borland places four zero bytes at the bottom of the data segment, followed by the Borland copyright notice "Borland C++ - Copyright 1991 Borland Intl.". In the small and medium memory models, a null pointer points to DS:0000. Thus assigning a value to the memory referenced by this pointer will overwrite the first zero byte in the data segment. At program termination, the four zeros and the copyright banner are checked. If either has been modified, then the Null Pointer Assignment error is generated. Note that the pointer may not truly be null, but may be a wild pointer that references these key areas in the data segment.
Data Structures
How to build an expression trees ?
Ans: An expression tree is a binary tree which is built from simple operands and operators of an (arithmetic or logical ) expression by placing simple operands as the leaves of a binary tree and the operators as the interior nodes. If an operator is binary , then it has two nonempty subtrees, that are its left and right operands (either simple operands or sub expressions). If an operator is unary, then only one of its subtrees is nonempty, the one on the left or right according as the operator is written on the right or left of its operand. We traditionally write some unary operators to the left of their operands, such as "-" ( unary negation) or the standard functions like log( ), sin( ) etc. Others are written on the right, such as the factorial function ()!. If the operator is written on the left, then in the expression tree we take its left subtree as empty. If it appears on the right, then its right subtree will be empty. An example of an expression tree is shown below for the expression ( -a < b ) or ( c + d ) .
Answer:- Yes. Although the % operator fails to work on float numbers we can still get the remainder of floating point division by using a function fmod( ). The fmod( ) function divides the two float numbers passed to it as parameters and returns the remainder as a floating-point value. Following program shows fmod( ) function at work.
#includemain( ) { printf ( "%f", fmod ( 5.15, 3.0 ) ) ; } The above code snippet would give the output as 2.150000.
Answer:- C function modf( ) can be used to get the integer and fractional part of a floating point.
#include "math.h" main( ) { double val, i, f ; val = 5.15 ; f = modf ( val, &i ) ; printf ( "\nFor the value %f integer part = %f and fractional part = %f", val, i, f ) ; } The output of the above program will be: For the value 5.150000 integer part = 5.000000 and fractional part = 0.150000
Answer:- char * ( *p )( ) ;
or
typedef char * ( * ptrtofun )( ) ;
ptrtofun p ;
Here is a sample program which uses this definition.
main( )
{
typedef char * ( * ptrtofun ) ( ) ;
char * fun( ) ;
ptrtofun fptr ;
char *cptr ;
fptr = fun ;
cptr = (*fptr) ( ) ;
printf ( "\nReturned string is \"%s\"", cptr ) ;
}
char * fun( )
{
static char s[ ] = "Hello!" ;
printf ( "\n%s", s ) ;
return s ;
}
Answer:-
* applies only to ptr1 and not to ptr2. Hence ptr1 is getting declared as a char pointer, whereas, ptr2 is being declared merely as a char. This can be rectified in two ways : char *ptr1, *ptr2 ; typedef char* CHARPTR ; CHARPTR ptr1, ptr2 ;
Answer:- To read the date in the form of dd-mm-yy one possible way is,
int dd, mm, yy ;
char ch ; /* for char '-' */
printf ( "\nEnter the date in the form of dd-mm-yy : " ) ;
scanf( "%d%c%d%c%d", &dd, &ch, &mm, &ch, &yy ) ;
Another way is to use suppression character * is as follows:
int dd, mm, yy ;
scanf( "%d%*c%d%*c%d", &dd, &mm, &yy ) ;
The suppression character '*' suppresses the input read from the standard input buffer for the assigned control character.
Answer:- Character constants in C are of type int, hence sizeof ( 'a' ) is equivalent to sizeof ( int ), i.e. 2. Hence the output comes out to be 2 bytes.
Answer:- Yes. Although we usually use scanf( ) function to receive a single word string and gets( ) to receive a multi-word string from keyboard we can also use scanf( ) function for scanning a multi-word string from keyboard. Following program shows how to achieve this.
main( )
{
char buff[15] ;
scanf ( "%[^\n]s", buff ) ;
puts ( buff ) ;
}
In the scanf( ) function we can specify the delimiter in brackets after the ^ character. We have specified '\n' as the delimiter. Hence scanf( ) terminates only when the user hits Enter key.
Answer:- We can set the system date using the setdate( ) function as shown in the following program. The function assigns the current time to a
structure date.
#include "stdio.h" #include "dos.h" main( ) { struct date new_date ; new_date.da_mon = 10 ; new_date.da_day = 14 ; new_date.da_year = 1993 ; setdate ( &new_date ) ; }
Answer:- Given below is the program which uses the stringizing preprocessor directive ## for building a general purpose swap macro which can swap two integers, two floats, two chars, etc.
#define swap( a, b, t ) ( g ## t = ( a ), ( a ) = ( b ), ( b ) = g ## t ) int gint; char gchar; float gfloat ; main( ) { int a = 10, b = 20 ; char ch1 = 'a' , ch2 = 'b' ; float f1 = 1.12, f2 = 3.14 ; swap ( a, b, int ) ; printf ( "\na = %d b = %d", a, b ) ; swap ( ch1, ch2, char ) ; printf ( "\nch1 = %c ch2 = %c", ch1, ch2 ) ; swap ( f1, f2, float ) ; printf ( "\nf1 = %4.2f f2 = %4.2f", f1, f2 ) ; } swap ( a, b, int ) would expand to, ( gint = ( a ), ( a ) = ( b ), ( b ) = gint )
Copyright © 2022 Shineskill Software Pvt. Ltd., All rights reserved.