comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ) 
Author Message
 comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

Archive-name: C-faq/abridged
Comp-lang-c-archive-name: C-FAQ-list.abridged
URL: http://www.*-*-*.com/ ~scs/C-faq/top.html

[Last modified February 7, 1999 by scs.]

This article is Copyright 1990-1999 by Steve Summit.  Content from the
book _C Programming FAQs: Frequently Asked Questions_ is made available
here by permission of the author and the publisher as a service to the
community.  It is intended to complement the use of the published text
and is protected by international copyright laws.  The content is made
available here and may be accessed freely for personal use but may not
be republished without permission.

This article contains minimal answers to the comp.lang.c frequently-
asked questions list.  More detailed explanations and references can be
found in the long version (see question 20.40 for availability), and
in the web version at http://www.*-*-*.com/ ~scs/C-faq/top.html ,
and in the book _C Programming FAQs: Frequently Asked Questions_
(Addison-Wesley, 1996, ISBN 0-201-84519-9).

Section 1. Declarations and Initializations

1.1:    How do you decide which integer type to use?

A:      If you might need large values (tens of thousands), use long.
        Otherwise, if space is very important, use short.  Otherwise,
        use int.

1.4:    What should the 64-bit type on a machine that can support it?

A:      C9X specifies long long.

1.7:    What's the best way to declare and define global variables?

A:      The best arrangement is to place each definition in some
        relevant .c file, with an external declaration in a header file.

1.11:   What does extern mean in a function declaration?

A:      Nothing, really; the keyword extern is optional here.

1.12:   What's the auto keyword good for?

A:      Nothing.

1.14:   I can't seem to define a linked list node which contains a
        pointer to itself.

A:      Structures in C can certainly contain pointers to themselves;
        the discussion and example in section 6.5 of K&R make this
        clear.  Problems arise if an attempt is made to define (and use)
        a typedef in the midst of such a declaration; avoid this.

1.21:   How do I declare an array of N pointers to functions returning
        pointers to functions returning pointers to characters?

A:      char *(*(*a[N])())();
        Using a chain of typedefs, or the cdecl program, makes these
        declarations easier.

1.22:   How can I declare a function that returns a pointer to a
        function of its own type?

A:      You can't quite do it directly.  Use a cast, or wrap a struct
        around the pointer and return that.

1.25:   My compiler is complaining about an invalid redeclaration of a
        function, but I only define it once.

A:      Calling an undeclared function declares it implicitly as
        returning int.

1.25b:  What's the right declaration for main()?

A:      See questions 11.12a to 11.15.

1.30:   What am I allowed to assume about the initial values
        of variables which are not explicitly initialized?

A:      Uninitialized variables with "static" duration start out as 0,
        as if the programmer had initialized them.  Variables with
        "automatic" duration, and dynamically-allocated memory, start
        out containing garbage (with the exception of calloc).

1.31:   Why can't I initialize a local array with a string?

A:      Perhaps you have a pre-ANSI compiler.

1.31b:  What's wrong with "char *p = malloc(10);" ?

A:      Function calls are not allowed in initializers for global or
        static variables.

1.32:   What is the difference between char a[] = "string"; and
        char *p = "string"; ?

A:      The first declares an initialized and modifiable array; the
        second declares a pointer initialized to a not-necessarily-
        modifiable constant string.

1.34:   How do I initialize a pointer to a function?

A:      Use something like "extern int func(); int (*fp)() = func;" .

Section 2. Structures, Unions, and Enumerations

2.1:    What's the difference between struct x1 { ... }; and
        typedef struct { ... } x2; ?

A:      The first structure is named by a tag, the second by a typedef

2.2:    Why doesn't "struct x { ... }; x thestruct;" work?

A:      C is not C++.

2.3:    Can a structure contain a pointer to itself?

A:      See question 1.14.

2.4:    What's the best way of implementing opaque (abstract) data types
        in C?

A:      One good way is to use structure pointers which point to
        structure types which are not publicly defined.

2.6:    I came across some code that declared a structure with the last
        member an array of one element, and then did some tricky
        allocation to make it act like the array had several elements.
        Is this legal or portable?

A:      An official interpretation has deemed that it is not strictly
        conforming with the C Standard.

2.7:    I heard that structures could be assigned to variables and
        passed to and from functions, but K&R1 says not.

A:      These operations are supported by all modern compilers.

2.8:    Is there a way to compare structures automatically?

A:      No.

2.10:   Can I pass constant values to functions which accept structure

A:      Not yet.  As of this writing, C has no way of generating
        anonymous structure values.

2.11:   How can I read/write structures from/to data files?

A:      It is relatively straightforward to use fread and fwrite.

2.12:   How can I turn off structure padding?

A:      There is no standard method.

2.13:   Why does sizeof report a larger size than I expect for a
        structure type?

A:      The alignment of arrays of structures must be preserved.

2.14:   How can I determine the byte offset of a field within a

A:      ANSI C defines the offsetof() macro, which should be used if

2.15:   How can I access structure fields by name at run time?

A:      Build a table of names and offsets, using the offsetof() macro.

2.18:   I have a program which works correctly, but dumps core after it
        finishes.  Why?

A:      Check to see if a structure type declaration just before main()
        is missing its trailing semicolon, causing main() to be declared
        as returning a structure.  See also questions 10.9 and 16.4.

2.20:   Can I initialize unions?

A:      The current C Standard allows an initializer for the first-named

2.22:   What is the difference between an enumeration and a set of
        preprocessor #defines?

A:      At the present time, there is little difference.  The C Standard
        states that enumerations are compatible with integral types.

2.24:   Is there an easy way to print enumeration values symbolically?

A:      No.

Section 3. Expressions

3.1:    Why doesn't the code "a[i] = i++;" work?

A:      The variable i is both referenced and modified in the same

3.2:    Under my compiler, the code "int i = 7;
        printf("%d\n", i++ * i++);" prints 49.  Regardless of the order
        of evaluation, shouldn't it print 56?

A:      The operations implied by the postincrement and postdecrement
        operators ++ and -- are performed at some time after the
        operand's former values are yielded and before the end of the
        expression, but not necessarily immediately after, or before
        other parts of the expression are evaluated.

3.3:    What should the code "int i = 3; i = i++;" do?

A:      The expression is undefined.

3.3b:   Here's a slick expression: "a ^= b ^= a ^= b".  It swaps a and b
        without using a temporary.

A:      Not portably; its behavior is undefined.

3.4:    Don't precedence and parentheses dictate order of evaluation?

A:      Operator precedence and explicit parentheses impose only a
        partial ordering on the evaluation of an expression, which does
        not generally include the order of side effects.

3.5:    But what about the && and || operators?

A:      There is a special exception for those operators: left-to-right
        evaluation is guaranteed.

3.8:    What's a "sequence point"?

A:      A point (at the end of a full expression, or at the ||, &&, ?:,
        or comma operators, or just before a function call) at which all
        side effects are guaranteed to be complete.

3.9:    So given a[i] = i++; we don't know which cell of a[] gets
        written to, but i does get incremented by one, right?

A:      *No*.  Once an expression or program becomes undefined, *all*
        aspects of it become undefined.

3.12:   If I'm not using the value of the expression, should I use i++
        or ++i to increment a variable?

A:      Since the two forms differ only in the value yielded, they are
        entirely equivalent when only their side effect is needed.

3.14:   Why doesn't the code "int a = 1000, b = 1000;
        long int c = a * b;" work?

A:      You must manually cast one of the operands to (long).

3.16:   Can I use ?: on the left-hand side of an assignment expression?

A:      No.

Section 4. Pointers

4.2:    What's wrong with "char *p; *p = malloc(10);"?

A:      The pointer you declared is p, not *p.

4.3:    Does *p++ increment p, or what it points to?

A:      *p++ increments p.  To increment the value pointed to by p, use
        (*p)++ .

4.5:    I want to use a char * pointer to step over some ints.  Why
        doesn't "((int *)p)++;" work?

A:      In C, a cast operator is a conversion operator, and by
        definition it yields an rvalue, which cannot be assigned to, or
        incremented with ++.

4.8:    I have a function which accepts, and is supposed to initialize,
        a pointer, but the pointer in the caller remains unchanged.

A:      The called function probably altered only the passed copy of the

4.9:    Can I use a void ** pointer as a parameter so that a function
        can accept a generic pointer by reference?

A:      Not portably.

4.10:   I have a function which accepts a pointer to an int.  How can I
        pass a constant like 5 to it?

A:      You will have to declare a temporary variable.

4.11:   Does C even have "pass by reference"?

A:      Not really, though it can be simulated.

4.12:   I've seen different methods used for calling functions via

A:      The extra parentheses and explicit * are now officially
        optional, although some older implementations require them.

Section 5. Null Pointers

5.1:    What is this infamous null pointer, anyway?

A:      For each pointer type, there is a special value -- the "null
        pointer" -- which is distinguishable from all other pointer
        values and which is not the address of any object or function.

5.2:    How do I get a null pointer in my programs?

A:      A constant 0 in a pointer

read more »

Sat, 18 Jan 2003 03:00:00 GMT  
 comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

>Archive-name: C-faq/abridged
>Comp-lang-c-archive-name: C-FAQ-list.abridged

>[Last modified February 7, 1999 by scs.]

>This article is Copyright 1990-1999 by Steve Summit.  Content from the


I note that neither this doc nor the unabridged version cast malloc
any more (that i could find anyway). Hopefully this answers a question
someone posted a couple of days back.

Mark McIntyre

Sun, 19 Jan 2003 03:00:00 GMT  
 [ 2 post ] 

 Relevant Pages 

1. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

2. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

3. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

4. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

5. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

6. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

7. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

8. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

9. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

10. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

11. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)

12. comp.lang.c Answers (Abridged) to Frequently Asked Questions (FAQ)


Powered by phpBB® Forum Software