Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

C Programming Language

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.eskimo.com/~scs/C-faq/top.html

[Last modified July 3, 2004 by scs.]

This article is Copyright 1990-2004 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 on-line content
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, or ftp
to rtfm.mit.edu, or send the mail message "help" to mail-
ser@rtfm.mit.edu).  Or, see the web version at
http://www.eskimo.com/~scs/C-faq/top.html , or the book _C Programming
FAQs: Frequently Asked Questions_ (Addison-Wesley, 1996, ISBN
0-201-84519-9).

Section 1. Declarations and Initializations

1.1:    How should I 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 be on a machine that can support it?

A:      C99 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 char?

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

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 through 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
        name.

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:    How can I implement 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.4b:   Is there a good way of simulating OOP-style inheritance in C?

A:      There are some clumsy ways, but nothing like C++.

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.8:    Is there a way to compare structures automatically?

A:      No.

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

A:      In C99 you can use "compound literals".

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
        structure?

A:      ANSI C defines the offsetof() macro in <stddef.h>.

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 main() is misdeclared, perhaps because a
        preceding structure type declaration 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:      In the original ANSI C, only the first-named member; in C99,
        using "designated initializers", yes, any member.

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

A:      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 modified and separately referenced in the
        same expression.

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 these 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:      Not necessarily!  Once an expression or program becomes
        undefined, *all* aspects of it become undefined.

3.12a:  What's the difference between ++i and i++?

A:      ++i adds one to i and "returns" the incremented value; i++
        returns the prior, unincremented value.

3.12b:  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
        pointer.

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:      In C99, you can use a "compound literal".  Otherwise, 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 syntax used for calling functions via
        pointers.

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

4.15:   How do I convert an int to a char *?

A:      See question 13.1, 8.6, or 19.25, depending on what you're
        trying to do.

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
...

read more »

On Jun 1, 5:00 am, s@eskimo.com (Steve Summit) wrote:

> 20.25:  How can I call FORTRAN(C++, BASIC, Pascal, Ada, LISP) functions
>         from C?

> A:      The answer is entirely dependent on the machine and the specific
>         calling sequences of the various compilers in use.

Fortran 2003 specifies how Fortran can call and be called by C, and
some Fortran 95 compilers support the C interoperability feature. So
this answer is out of date and should be corrected.

Beliavsky <beliav@aol.com> wrote:
> s@eskimo.com (Steve Summit) wrote:
> > 20.25:  How can I call FORTRAN(C++, BASIC, Pascal, Ada, LISP)
> > functions from C?

> > A: The answer is entirely dependent on the machine and
> >    the specific calling sequences of the various compilers
> >    in use.

> Fortran 2003 specifies how Fortran can call and be called
> by C,

There is no requirement for a conforming C implementation to
adhere to any Fortran 2003 specification.

> and some Fortran 95 compilers support the C interoperability
> feature. So this answer is out of date and should be corrected.

Revised perhaps, but to be corrected it first needs to be
wrong. Your comments in no way invalidate the answer to the
FAQ. The requirements still exist, whether Fortran 2003
supports them or not.

--
Peter

Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc