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-
This e-mail address is being protected from spam bots, you need JavaScript enabled to view it
). 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 _link_ed 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. _expression_s 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( %dn , 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