C,c++ interview q&a


Published on

  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

C,c++ interview q&a

  1. 1. C & C++ Interview Q&AHow do I know how many elements an array can hold?The amount of memory an array can consume depends on the data type of an array. InDOS environment, the amount of memory an array can consume depends on the currentmemory model (i.e. Tiny, Small, Large, Huge, etc.). In general an array cannot consumemore than 64 kb. Consider following program, which shows the maximum number ofelements an array of type int, float and char can have in case of Small memory model.main( ){int i[32767] ;float f[16383] ;char s[65535] ;}How do I write code that reads data at memory location specifiedby segment and offset?Use peekb( ) function. This function returns byte(s) read from specific segment and offsetlocations in memory. The following program illustrates use of this function. In thisprogram from VDU memory we have read characters and its attributes of the first row.The information stored in file is then further read and displayed using peek( ) function.#include <stdio.h>#include <dos.h>main( ){char far *scr = 0xB8000000 ;FILE *fp ;int offset ;char ch ;if ( ( fp = fopen ( "scr.dat", "wb" ) ) == NULL ){printf ( "nUnable to open file" ) ;exit( ) ;}// reads and writes to filefor ( offset = 0 ; offset < 160 ; offset++ )fprintf ( fp, "%c", peekb ( scr, offset ) ) ;fclose ( fp ) ;if ( ( fp = fopen ( "scr.dat", "rb" ) ) == NULL ){printf ( "nUnable to open file" ) ;exit( ) ;}
  2. 2. // reads and writes to filefor ( offset = 0 ; offset < 160 ; offset++ ){fscanf ( fp, "%c", &ch ) ;printf ( "%c", ch ) ;}fclose ( fp ) ;}What is conversion operator?class can have a public method for specific data type conversions.for example:class Boo{double value;public:Boo(int i )operator double(){return value;}};Boo BooObject;double i = BooObject; // assigning object to variable i of type double. now conversionoperator gets called to assign the value.What is difference between template and macro?There is no way for the compiler to verify that the macro parameters are of compatibletypes. The macro is expanded without any special type checking.If macro parameter has a postincremented variable ( like c++ ), the increment isperformed two times.Because macros are expanded by the preprocessor, compiler error messages will refer tothe expanded macro, rather than the macro definition itself. Also, the macro will show upin expanded form during debugging.for example:Macro:#define min(i, j) (i < j ? i : j)template:template<class T>
  3. 3. T min (T i, T j){return i < j ? i : j;}What is difference between malloc()/free() and new/delete?malloc allocates memory for object in heap but doesnt invoke objects constructor toinitiallize the object.new allocates memory and also invokes constructor to initialize the object.malloc() and free() do not support object semanticsDoes not construct and destruct objectsstring * ptr = (string *)(malloc (sizeof(string)))Are not safeDoes not calculate the size of the objects that it constructReturns a pointer to voidint *p = (int *) (malloc(sizeof(int)));int *p = new int;Are not extensiblenew and delete can be overloaded in a class"delete" first calls the objects termination routine (i.e. its destructor) and then releases thespace the object occupied on the heap memory. If an array of objects was created usingnew, then delete must be told that it is dealing with an array by preceding the name withan empty []:-Int_t *my_ints = new Int_t[10];…delete []my_ints;What is conversion operator?class can have a public method for specific data type conversions.for example:class Boo{double value;public:Boo(int i )operator double(){return value;
  4. 4. }};Boo BooObject;double i = BooObject; // assigning object to variable i of type double. now conversionoperator gets called to assign the value.How do I write code that reads data at memory location specifiedby segment and offset?Use peekb( ) function. This function returns byte(s) read from specific segment and offsetlocations in memory. The following program illustrates use of this function. In thisprogram from VDU memory we have read characters and its attributes of the first row.The information stored in file is then further read and displayed using peek( ) function.#include <stdio.h>#include <dos.h>main( ){char far *scr = 0xB8000000 ;FILE *fp ;int offset ;char ch ;if ( ( fp = fopen ( "scr.dat", "wb" ) ) == NULL ){printf ( "nUnable to open file" ) ;exit( ) ;}// reads and writes to filefor ( offset = 0 ; offset < 160 ; offset++ )fprintf ( fp, "%c", peekb ( scr, offset ) ) ;fclose ( fp ) ;if ( ( fp = fopen ( "scr.dat", "rb" ) ) == NULL ){printf ( "nUnable to open file" ) ;exit( ) ;}// reads and writes to filefor ( offset = 0 ; offset < 160 ; offset++ ){fscanf ( fp, "%c", &ch ) ;printf ( "%c", ch ) ;}fclose ( fp ) ;}
  5. 5. What is Difference Between C/C++C does not have a class/object concept.C++ provides data abstraction, data encapsulation, Inheritance and Polymorphism.C++ supports all C syntax.In C passing value to a function is "Call by Value" whereas in C++ its "Call byReference"File extension is .c in C while .cpp in C++.(C++ compiler compiles the files with .cextension but C compiler can not!)In C structures can not have contain functions declarations. In C++ structures are likeclasses, so declaring functions is legal and allowed.C++ can have inline/virtual functions for the classes.c++ is C with Classes hence C++ while in c the closest u can get to an User defined datatype is struct and union.What are TemplatesC++ Templates allow u to generate families of functions or classes that can operate on avariety of different data types, freeing you from the need to create a separate function orclass for each type. Using templates, u have the convenience of writing a single genericfunction or class definition, which the compiler automatically translates into a specificversion of the function or class, for each of the different data types that your programactually uses. Many data structures and algorithms can be defined independently of thetype of data they work with. You can increase the amount of shared code by separatingdata-dependent portions from data-independent portions, and templates were introducedto help you do that.What is Polymorphism ?Polymorphism is an object oriented term. Polymorphism may be defined as the ability ofrelated objects to respond to the same message with different, but appropriate actions. Inother words, polymorphism means taking more than one form. Polymorphism leads totwo important aspects in Object Oriented terminology - Function Overloading andFunction Overriding. Overloading is the practice of supplying more than one definitionfor a given function name in the same scope. The compiler is left to pick the appropriateversion of the function or operator based on the arguments with which it is called.Overriding refers to the modifications made in the sub class to the inherited methodsfrom the base class to change their behavior.Is it acceptable to declare/define a variable in a C header?A global variable that must be accessed from more than one file can and should bedeclared in a header file. In addition, such a variable must be defined in one source file.
  6. 6. Variables should not be defined in header files, because the header file can be included inmultiple source files, which would cause multiple definitions of the variable. The ANSIC standard will allow multiple external definitions, provided that there is only oneinitialization. But because there’s really no advantage to using this feature, it’s probablybest to avoid it and maintain a higher level of portability.Global variables that do not have to be accessed from more than one file should bedeclared static and should not appear in a header file.What is a void pointer?A void pointer is a C convention for a raw address. The compiler has no idea what typeof object a void Pointer really points to. If you writeint *ip;ip points to an int. If you writevoid *p;p doesn’t point to a void!In C and C++, any time you need a void pointer, you can use another pointer type. Forexample, if you have a char*, you can pass it to a function that expects a void*. Youdon’t even need to cast it. In C (but not in C++), you can use a void* any time you needany kind of pointer, without casting. (In C++, you need to cast it).A void pointer is used for working with raw memory or for passing a pointer to anunspecified type.Some C code operates on raw memory. When C was first invented, character pointers(char *) were used for that. Then people started getting confused about when a characterpointer was a string, when it was a character array, and when it was raw memory.What is a macro and how do you use it?A macro is a preprocessor directive that provides a mechanism for token replacement inyour source code. Macros are created by using the #define statement.Here is an example of a macro: Macros can also utilize special operators such as thestringizing operator (#) and the concatenation operator (##).The stringizing operator canbe used to convert macro parameters to quoted strings, as in the following example:#define DEBUG_VALUE(v) printf(#v is equal to %d.n, v)In your program, you can check the value of a variable by invoking theDEBUG_VALUE macro:…int x = 20;DEBUG_VALUE(x);…The preceding code prints x is equal to 20. on-screen. This example shows that thestringizing operator used with macros can be a very handy debugging tool.Is it better to use malloc() or calloc()?Both the
  7. 7. and the calloc() functions are used to allocate dynamic memory. Each operates slightlydifferent from the other. malloc() takes a size and returns a pointer to a chunk of memoryat least that big:void *malloc( size_t size );calloc() takes a number of elements, and the size of each, and returns a pointer to a chunkof memory at least big enough to hold them all:void *calloc( size_t numElements, size_t sizeOfElement );There’s one major difference and one minor difference between the two functions. Themajor difference is that malloc() doesn’t initialize the allocated memory. The first timemalloc() gives you a particular chunk of memory, the memory might be full of zeros. Ifmemory has been allocated, freed, and reallocated, it probably has whatever junk was leftin it. That means, unfortunately, that a program might run in simple cases (when memoryis never reallocated) but break when used harder (and when memory is reused). calloc()fills the allocated memory with all zero bits. That means that anything there you’re goingto use as a char or an int of any length, signed or unsigned, is guaranteed to be zero.Anything you’re going to use as a pointer is set to all zero bits. That’s usually a nullpointer, but it’s not guaranteed.Anything you’re going to use as a float or double is set toall zero bits; that’s a floating-point zero on some types of machines, but not on all.The minor difference between the two is that calloc() returns an array of objects; malloc()returns one object. Some people use calloc() to make clear that they want an array.What is the easiest searching method to use?Just as qsort() was the easiest sorting method, because it is part of the standard library,bsearch() is the easiest searching method to use. If the given array is in the sorted orderbsearch() is the best method.Following is the prototype for bsearch():void *bsearch(const void *key, const void *buf, size_t num, size_t size, int(*comp)(const void *, const void*));Another simple searching method is a linear search. A linear search is not as fast asbsearch() for searching among a large number of items, but it is adequate for manypurposes. A linear search might be the only method available, if the data isn’t sorted orcan’t be accessed randomly. A linear search starts at the beginning and sequentiallycompares the key to each element in the data set.When would you use a pointer to a function?Pointers to functions are interesting when you pass them to other functions. A functionthat takes function pointers says, in effect, Part of what I do can be customized. Give mea pointer to a function, and I’ll call it when that part of the job needs to be done. Thatfunction can do its part for me. This is known as a callback. It’s used a lot in graphicaluser interface libraries, in which the style of a display is built into the library but thecontents of the display are part of the application.As a simpler example, say you have an array of character pointers (char*s), and you wantto sort it by the value of the strings the character pointers point to. The standard qsort()function uses function pointers to perform that task. qsort() takes four arguments,
  8. 8. - a pointer to the beginning of the array,- the number of elements in the array,- the size of each array element, and- a comparison function, and returns an int.How can you avoid including a header more than once?One easy technique to avoid multiple inclusions of the same header is to use the #ifndefand #definepreprocessor directives. When you create a header for your program, you can #define asymbolic name that is unique to that header. You can use the conditional preprocessordirective named #ifndef to check whether that symbolic name has already been assigned.If it is assigned, you should not include the header, because it has already beenpreprocessed. If it is not defined, you should define it to avoid any further inclusions ofthe header. The following header illustrates this technique:#ifndef _FILENAME_H#define _FILENAME_H#define VER_NUM 1.00.00#define REL_DATE 08/01/94#if _ _WINDOWS_ _#define OS_VER WINDOWS#else#define OS_VER DOS#endif#endifWhen the preprocessor encounters this header, it first checks to see whether_FILENAME_H has been defined. If it hasn’t been defined, the header has not beenincluded yet, and the _FILENAME_H symbolic name is defined. Then, the rest of theheader is parsed until the last #endif is encountered, signaling the end of the conditional#ifndef _FILENAME_H statement. Substitute the actual name of the header file forFILENAME in the preceding example to make it applicable for your programs.mory allocation: The compiler allocates the required memory space for a declaredvariable.By using the address of operator,the reserved address is obtained and thisaddress may be assigned to a pointer variable.Since most of the declared variable havestatic memory,this way of assigning pointer value to a pointer variable is known as staticmemory allocation. memory is assigned during compilation time.Dynamic memory allocation: It uses functions such as malloc( ) or calloc( ) to getmemory dynamically.If these functions are used to get memory dynamically and thevalues returned by these functions are assingned to pointer variables, such assignmentsare known as dynamic memory allocation.memory is assined during run time.
  9. 9. What is Preprocessor?The preprocessor is used to modify your program according to the preprocessor directivesin your source code. Preprocessor directives (such as #define) give the preprocessorspecific instructions on how to modify your source code. The preprocessor reads in all ofyour include files and the source code you are compiling and creates a preprocessedversion of your source code. This preprocessed version has all of its macros and constantsymbols replaced by their corresponding code and value assignments. If your source codecontains any conditional preprocessor directives (such as #if), the preprocessor evaluatesthe condition and modifies your source code accordingly.The preprocessor contains many features that are powerful to use, such as creatingmacros, performing conditional compilation, inserting predefined environment variablesinto your code, and turning compiler features on and off. For the professionalprogrammer, in-depth knowledge of the features of the preprocessor can be one of thekeys to creating fast, efficient programs.What is the benefit of using #define to declare a constant?Using the #define method of declaring a constant enables you to declare a constant in oneplace and use it throughout your program. This helps make your programs moremaintainable, because you need to maintain only the #define statement and not severalinstances of individual constants throughout your program.For instance, if your program used the value of pi (approximately 3.14159) several times,you might want to declare a constant for pi as follows:#define PI 3.14159Using the #define method of declaring a constant is probably the most familiar way ofdeclaring constants to traditional C programmers. Besides being the most commonmethod of declaring constants, it also takes up the least memory. Constants defined inthis manner are simply placed directly into your source code, with no variable spaceallocated in memory. Unfortunately, this is one reason why most debuggers cannotinspect constants created using the #define method.What is the benefit of using an enum rather than a #defineconstant?The use of an enumeration constant (enum) has many advantages over using thetraditional symbolic constant style of #define. These advantages include a lowermaintenance requirement, improved program readability, and better debuggingcapability.1) The first advantage is that enumerated constants are generated automatically by thecompiler. Conversely, symbolic constants must be manually assigned values by theprogrammer.For instance, if you had an enumerated constant type for error codes that could occur in
  10. 10. your program, your enum definition could look something like this:enum Error_Code{OUT_OF_MEMORY,INSUFFICIENT_DISK_SPACE,LOGIC_ERROR,FILE_NOT_FOUND};In the preceding example, OUT_OF_MEMORY is automatically assigned the value of 0(zero) by the compiler because it appears first in the definition. The compiler thencontinues to automatically assign numbers to the enumerated constants, makingINSUFFICIENT_DISK_SPACE equal to 1, LOGIC_ERROR equal to 2, andFILE_NOT_FOUND equal to 3, so on.If you were to approach the same example by using symbolic constants, your code wouldlook something like this:#define OUT_OF_MEMORY 0#define INSUFFICIENT_DISK_SPACE 1#define LOGIC_ERROR 2#define FILE_NOT_FOUND 3values by the programmer. Each of the two methods arrives at the same result: fourconstants assigned numeric values to represent error codes. Consider the maintenancerequired, however, if you were to add two constants to represent the error codesDRIVE_NOT_READY and CORRUPT_FILE. Using the enumeration constant method,you simply would put these two constants anywhere in the enum definition. The compilerwould generate two unique values for these constants. Using the symbolic constantmethod, you would have to manually assign two new numbers to these constants.Additionally, you would want to ensure that the numbers you assign to these constantsare unique.2) Another advantage of using the enumeration constant method is that your programs aremore readable and thus can be understood better by others who might have to updateyour program later.3) A third advantage to using enumeration constants is that some symbolic debuggers canprint the value of an enumeration constant. Conversely, most symbolic debuggers cannotprint the value of a symbolic constant. This can be an enormous help in debugging yourprogram, because if your program is stopped at a line that uses an enum, you can simplyinspect that constant and instantly know its value. On the other hand, because mostdebuggers cannot print #define values, you would most likely have to search for thatvalue by manually looking it up in a header file.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
  11. 11. 2.If it is declared for a function name:By default function is extern..so it will be visible from other files if the functiondeclaration is as static..it is invisible for the outer files3. Static for global variables:By default we can use the global variables from outside files If it is static global..thatvariable is limited to with in the fileAdvantages of a macro over a function?Macro gets to see the Compilation environment, so it can expand __ __TIME____FILE__ #defines. It is expanded by the preprocessor.For example, you can’t do this without macros#define PRINT(EXPR) printf( #EXPR “=%dn”, 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 realwork gets done.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 the static specifier also have static scope.Memory obtained from calls to malloc(), alloc() or realloc() belongs to allocated storageclass.Oct 05What is the difference between strings and character arrays?A major difference is: string will have static storage duration, whereas as a characterarray will not, unless it is explicity specified by using the static keyword.Actually, a string is a character array with following properties:
  12. 12. * the multibyte character sequence, to which we generally call string, is used to initializean array of static storage duration. The size of this array is just sufficient to contain thesecharacters 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 thefollowing 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 nottrue 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, inorder.What is C language?The C programming language is a standardized programming language developed in theearly 1970s by Ken Thompson and Dennis Ritchie for use on the UNIX operatingsystem. It has since spread to many other operating systems, and is one of the mostwidely used programming languages. C is prized for its efficiency, and is the mostpopular programming language for writing system software, though it is also used forwriting applications. …printf() FunctionWhat is the output of printf("%d")?1. When we write printf("%d",x); this means compiler will print the value of x. But ashere, there is nothing after �%d� so compiler will show in output window garbagevalue.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 dependingon the format specification string. Now when we write printf("%d",a) then compiler firstaccesses the top most element in the argument stack of the printf which is %d anddepending on the format string it calculated to offset to the actual data variable in thememory which is to be printed. Now when only %d will be present in the printf thencompiler will calculate the correct offset (which will be the offset to access the integervariable) but as the actual data object is to be printed is not present at that memorylocation so it will print what ever will be the contents of that memory location.
  13. 13. 3. Some compilers check the format string and will generate an error without the propernumber and type of arguments for things like printf(…) and scanf(…).