Question: Should variables be stored in local blocks?
Answer: The use of local blocks for storing variables is unusual and therefore should be avoided, with only rare
exceptions. One of these exceptions would be for debugging purposes, when you might want to declare a
local instance of a global variable to test within your function. You also might want to use a local block when
you want to make your program more readable in the current context.
Sometimes having the variable
declared closer to where it is used makes your program more readable. However, well-written programs
usually do not have to resort to declaring variables in this manner, and you should avoid using local blocks.
Question: Can the last case of a switch statement skip including the break?
Answer: Even though the last case of a switch statement does not require a break statement at the end, you should
add break statements to all cases of the switch statement, including the last case. You should do so primarily
because your program has a strong chance of being maintained by someone other than you who might add
cases but neglect to notice that the last case has no break statement.
This oversight would cause what would formerly be the last case
statement to "fall through" to the new statements added to the bottom of
the switch statement. Putting a break after each case statement would prevent this possible mishap and make your
program more "bulletproof." Besides, most of today's optimizing compilers will optimize out the last break,
so there will be no performance degradation if you add it.
Question:What is an rvalue?
Answer: rvalue can be defined as an expression that can be assigned to an lvalue. The rvalue appears on the right side of an assignment statement.
Unlike an lvalue, an rvalue can be a constant or an expression, as shown here:
int x, y;
x = 1; /* 1 is an rvalue; x is an lvalue */
y = (x + 1); /* (x + 1) is an rvalue; y is an lvalue */
An assignment statement must have both an lvalue and an rvalue.
Therefore, the following statement would not compile because it is
missing an rvalue:
int x;
x = void_function_call() /* the function void_function_call()
returns nothing */
If the function had returned an integer, it would be considered an
rvalue because it evaluates into something that the lvalue, x, can
store.
Question: Where in memory are my variables stored?
Answer: Variables can be stored in several places in memory, depending on their lifetime. Variables that are defined
outside any function (whether of global or file static scope), and variables that are defined inside a function
as static variables, exist for the lifetime of the program's execution. These variables are stored in the "data
segment." The data segment is a fixed-size area in memory set aside for these variables. The data segment is
subdivided into two parts, one for initialized variables and another for uninitialized variables.
Variables that are defined inside a function as auto variables (that are not defined with the keyword static)
come into existence when the program begins executing the block of code (delimited by curly braces {})
containing them, and they cease to exist when the program leaves that block of code.
Variables that are the arguments to functions exist only during the call to that function. These variables are stored on the "stack".
The stack is an area of memory that starts out small and grows automatically up to some predefined limit.
In DOS and other systems without virtual memory, the limit is set either when the program is compiled or
when it begins executing. In UNIX and other systems with virtual memory, the limit is set by the system,
and it is usually so large that it can be ignored by the programmer.
The third and final area doesn't actually store variables but can be used to store data pointed to by variables.
Pointer variables that are assigned to the result of a call to the malloc() function contain the address of a
dynamically allocated area of memory. This memory is in an area called the "heap." The heap is another area
that starts out small and grows, but it grows only when the programmer explicitly calls malloc() or other
memory allocation functions, such as calloc(). The heap can share a memory segment with either the data
segment or the stack, or it can have its own segment. It all depends on the compiler options and operating
system. The heap, like the stack, has a limit on how much it can grow, and the same rules apply as to how
that limit is determined.
Question: Do variables need to be initialized?
Answer: No. All variables should be given a value before they are used, and a good compiler will help you find variables
that are used before they are set to a value. Variables need not be initialized, however. Variables defined
outside a function or defined inside a function with the static keyword are already initialized to 0 for you if you do not explicitly initialize them.
Automatic variables are variables defined inside a function or block of code without the static keyword.
These variables have undefined values if you don't explicitly initialize them. If you don't initialize an
automatic variable, you must make sure you assign to it before using the value.
Space on the heap allocated by calling malloc() contains undefined data as well and must be set to a known
value before being used. Space allocated by calling calloc() is set to 0 for you when it is allocated.
No comments:
Post a Comment