0% found this document useful (0 votes)
9 views126 pages

C For Java Programmers

The document provides an overview of learning C programming for Java programmers, highlighting the advantages and differences between C and Java, including memory management and performance. It discusses the historical context of C's development, its preprocessor, and the compilation process using the gcc compiler. Additionally, it contrasts C with C++ and outlines the structure of C programs compared to Java programs.

Uploaded by

vijay
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views126 pages

C For Java Programmers

The document provides an overview of learning C programming for Java programmers, highlighting the advantages and differences between C and Java, including memory management and performance. It discusses the historical context of C's development, its preprocessor, and the compilation process using the gcc compiler. Additionally, it contrasts C with C++ and outlines the structure of C programs compared to Java programs.

Uploaded by

vijay
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 126

C for Java Programmers

Advanced Programming
Credits
 Software Construction (J. Shepherd)
 Operating Systems at Cornell (Indranil
Gupta)

Feb 7, 2025 Advanced Programming 2


Spring 2002
Overview
 Why learn C after Java?
 A brief background on C
 C preprocessor
 Modular C programs

Feb 7, 2025 Advanced Programming 3


Spring 2002
Why learn C (after Java)?
 Both high-level and low-level language
 OS: user interface to kernel to device driver
 Better control of low-level mechanisms
 memory allocation, specific memory locations
 Performance sometimes better than Java (Unix,
NT!)
 usually more predictable (also: C vs. C++)
 Java hides many details needed for writing OS
code
But,….
 Memory management responsibility
 Explicit initialization and error detection
 generally, more lines for same functionality
 More room for mistakes
Feb 7, 2025 Advanced Programming 4
Spring 2002
Why learn C, cont’d.
 Most older code is written in C (or C++)
 Linux, *BSD
 Windows
 Most Java implementations
 Most embedded systems
 Philosophical considerations:
 Being multi-lingual is good!
 Should be able to trace program from UI to
assembly (EEs: to electrons)

Feb 7, 2025 Advanced Programming 5


Spring 2002
C pre-history
 1960s: slew of new languages
 COBOL for commercial programming
(databases)
 FORTRAN for numerical and scientific programs
 PL/I as second-generation unified language
 LISP, Simula for CS research, early AI
 Assembler for operating systems and timing-
critical code
 Operating systems:
 OS/360
 MIT/GE/Bell Labs Multics (PL/I)
Feb 7, 2025 Advanced Programming 6
Spring 2002
C pre-history
 Bell Labs (research arm of Bell System -
> AT&T -> Lucent) needed own OS
 BCPL as Multics language
 Ken Thompson: B
 Unix = Multics – bits
 Dennis Ritchie: new language = B +
types
 Development on DEC PDP-7 with 8K 16-
bit words

Feb 7, 2025 Advanced Programming 7


Spring 2002
C history
 C
 Dennis Ritchie in late 1960s and early 1970s
 systems programming language
 make OS portable across hardware platforms
 not necessarily for real applications – could be written in
Fortran or PL/I
 C++
 Bjarne Stroustrup (Bell Labs), 1980s
 object-oriented features
 Java
 James Gosling in 1990s, originally for embedded
systems
 object-oriented, like C++
 ideas and some syntax from C
Feb 7, 2025 Advanced Programming 8
Spring 2002
C for Java programmers
 Java is mid-90s high-level OO language
 C is early-70s procedural language
 C advantages:
 Direct access to OS primitives (system calls)
 Fewer library issues – just execute
 (More) C disadvantages:
 language is portable, APIs are not
 memory and “handle” leaks
 preprocessor can lead to obscure errors

Feb 7, 2025 Advanced Programming 9


Spring 2002
C vs. C++
 We’ll cover both, but C++ should be
largely familiar
 Very common in Windows
 Possible to do OO-style programming in
C
 C++ can be rather opaque: encourages
“clever” programming

Feb 7, 2025 Advanced Programming 10


Spring 2002
Aside: “generations” and
abstraction levels
 Binary, assembly
 Fortran, Cobol
 PL/I, APL, Lisp, …
 C, Pascal, Ada
 C++, Java, Modula3
 Scripting: Perl, Tcl, Python, Ruby, …
 XML-based languages: CPL, VoiceXML

Feb 7, 2025 Advanced Programming 11


Spring 2002
C vs. Java
Java C
object-oriented function-oriented
strongly-typed can be overridden
polymorphism (+, ==) very limited
(integer/float)
classes for name space (mostly) single name space,
file-oriented

macros are external, macros common


rarely used (preprocessor)
layered I/O model byte-stream I/O

Feb 7, 2025 Advanced Programming 12


Spring 2002
C vs. Java
Java C

automatic memory function calls (C++ has


management some support)
no pointers pointers (memory
addresses) common
by-reference, by-value by-value parameters
exceptions, exception if (f() < 0) {error}
handling OS signals
concurrency (threads) library functions

Feb 7, 2025 Advanced Programming 13


Spring 2002
C vs. Java
Java C

length of array on your own

string as type just bytes (char


[]), with 0 end
dozens of OS-defined
common libraries

Feb 7, 2025 Advanced Programming 14


Spring 2002
C vs. Java
 Java program
 collection of classes
 class containing main method is starting
class
 running java StartClass invokes
StartClass.main method
 JVM loads other classes as required

Feb 7, 2025 Advanced Programming 15


Spring 2002
C program
 collection of functions
 one function – main() – is starting
function
 running executable (default name a.out)
starts main function
 typically, single program with all user
code linked in – but can be dynamic
libraries (.dll, .so)

Feb 7, 2025 Advanced Programming 16


Spring 2002
C vs. Java
public class hello #include <stdio.h>
{ int main(int argc, char
public static void main *argv[])
(String args []) { {
System.out.println puts(“Hello, World”);
(“Hello world”); return 0;
} }
}

Feb 7, 2025 Advanced Programming 17


Spring 2002
What does this C program do ?
#include <stdio.h>
struct list{int data; struct list *next};
struct list *start, *end;
void add(struct list *head, struct list *list, int data};
int delete(struct list *head, struct list *tail);

void main(void){
start=end=NULL;
add(start, end, 2); add(start, end, 3);
printf(“First element: %d”, delete(start, end));
}

void add(struct list *head, struct list *tail, int data}{


if(tail==NULL){
head=tail=malloc(sizeof(struct list));
head->data=data; head->next=NULL;
}
else{
tail->next= malloc(sizeof(struct list));
tail=tail->next; tail->data=data; tail->next=NULL;
}
}

Feb 7, 2025 Advanced Programming 18


Spring 2002
What does this C program, do –
cont’d?
void delete (struct list *head, struct list *tail){
struct list *temp;
if(head==tail){
free(head); head=tail=NULL;
}
else{
temp=head->next; free(head); head=temp;
}
}

Feb 7, 2025 Advanced Programming 19


Spring 2002
Simple example

#include <stdio.h>

void main(void)
{
printf(“Hello World. \n \t and you ! \n ”);
/* print out a message */
return;
}

$Hello World.
and you !
$
Feb 7, 2025 Advanced Programming 20
Spring 2002
Dissecting the example
 #include <stdio.h>
 include header file stdio.h
 # lines processed by pre-processor
 No semicolon at end
 Lower-case letters only – C is case-sensitive
 void main(void){ … } is the only code executed
 printf(“ /* message you want printed */ ”);
 \n = newline, \t = tab
 \ in front of other special characters within
printf.
 printf(“Have you heard of \”The Rock\” ? \n”);
Feb 7, 2025 Advanced Programming 21
Spring 2002
Executing the C program
int main(int argc, char argv[])
 argc is the argument count
 argv is the argument vector
 array of strings with command-line
arguments
 the int value is the return value
 convention: 0 means success, > 0 some
error
 can also declare as void (no return value)

Feb 7, 2025 Advanced Programming 22


Spring 2002
Executing a C program
 Name of executable + space-separated
arguments
 $ a.out 1 23 ‘third arg’

argc argv

a.out 1 23 “third arg”

Feb 7, 2025 Advanced Programming 23


Spring 2002
Executing a C program
 If no arguments, simplify:
int main() {
puts(“Hello World”);
exit(0);
}
 Uses exit() instead of return – same
thing.

Feb 7, 2025 Advanced Programming 24


Spring 2002
Executing C programs
 Scripting languages are usually interpreted
 perl (python, Tcl) reads script, and executes it
 sometimes, just-in-time compilation – invisible
to user
 Java programs semi-interpreted:
 javac converts foo.java into foo.class
 not machine-specific
 byte codes are then interpreted by JVM
 C programs are normally compiled and
linked:
 gcc converts foo.c into a.out
 a.out is executed by OS and hardware

Feb 7, 2025 Advanced Programming 25


Spring 2002
Executing C programs
x.pl perl results

data

x.java javac java

args

x.c, gcc, a.out


x.cc g++

Feb 7, 2025 Advanced Programming 26


Spring 2002
The C compiler gcc
 gcc invokes C compiler
 gcc translates C program into
executable for some target
 default file name a.out
 also “cross-compilation”
$ gcc hello.c
$ a.out
Hello, World!

Feb 7, 2025 Advanced Programming 27


Spring 2002
gcc
 Behavior controlled by command-line
switches:
-o file output file for object or executable
-Wall all warnings – use always!
-c compile single module (non-main)
-g insert debugging code (gdb)
-p insert profiling code

-l library
-E preprocessor output only

Feb 7, 2025 Advanced Programming 28


Spring 2002
Using gcc
 Two-stage compilation
 pre-process & compile: gcc –c hello.c
 link: gcc –o hello hello.o
 Linking several modules:
gcc –c a.c  a.o
gcc –c b.c  b.o
gcc –o hello a.o b.o
 Using math library
 gcc –o calc calc.c -lm

Feb 7, 2025 Advanced Programming 29


Spring 2002
Error reporting in gcc
 Multiple sources
 preprocessor: missing include files
 parser: syntax errors
 assembler: rare
 linker: missing libraries

Feb 7, 2025 Advanced Programming 30


Spring 2002
Error reporting in gcc
 If gcc gets confused, hundreds of
messages
 fix first, and then retry – ignore the rest
 gcc will produce an executable with
warnings
 don’t ignore warnings – compiler choice is
often not what you had in mind
 Does not flag common mindos
 if (x = 0) vs. if (x == 0)

Feb 7, 2025 Advanced Programming 31


Spring 2002
gcc errors
 Produces object code for each module
 Assumes references to external names
will be resolved later
 Undefined names will be reported when
linking:
undefined symbol first referenced in file
_print program.o
ld fatal: Symbol referencing errors
No output written to file.

Feb 7, 2025 Advanced Programming 32


Spring 2002
C preprocessor
 The C preprocessor (cpp) is a macro-
processor which
 manages a collection of macro definitions
 reads a C program and transforms it
 Example:
#define MAXVALUE 100
#define check(x) ((x) < MAXVALUE)
if (check(i) { …}

becomes
if ((i) < 100) {…}

Feb 7, 2025 Advanced Programming 33


Spring 2002
C preprocessor
 Preprocessor directives start with # at
beginning of line:
 define new macros
 input files with C code (typically, definitions)
 conditionally compile parts of file
 gcc –E shows output of preprocessor
 Can be used independently of compiler

Feb 7, 2025 Advanced Programming 34


Spring 2002
C preprocessor
#define name const-expression
#define name (param1,param2,…)
expression
#undef symbol
 replaces name with constant or expression
 textual substitution
 symbolic names for global constants
 in-line functions (avoid function call
overhead)
 mostly unnecessary for modern compilers
 type-independent code
Feb 7, 2025 Advanced Programming 35
Spring 2002
C preprocessor
 Example: #define MAXLEN 255
 Lots of system .h files define macros
 invisible in debugger
 getchar(), putchar() in stdio library
Caution: don’t treat macros like
function calls
#define valid(x) ((x) > 0 && (x) < 20)
if (valid(x++)) {…}
valid(x++) -> ((x++) > 0 && (x++) < 20)

Feb 7, 2025 Advanced Programming 36


Spring 2002
C preprocessor –file inclusion
#include “filename.h”
#include <filename.h>
 inserts contents of filename into file to be
compiled
 “filename” relative to current directory
 <filename> relative to /usr/include
 gcc –I flag to re-define default
 import function prototypes (cf. Java import)
 Examples:
#include <stdio.h>
#include “mydefs.h”
#include “/home/alice/program/defs.h”
Feb 7, 2025 Advanced Programming 37
Spring 2002
C preprocessor – conditional
compilation
#if expression
code segment 1
#else
code segment 2
#endif
 preprocessor checks value of expression
 if true, outputs code segment 1, otherwise code segment 2
 machine or OS-dependent code
 can be used to comment out chunks of code – bad!
#define OS linux

#if OS == linux
puts(“Linux!”);
#else
puts(“Something else”);
#endif

Feb 7, 2025 Advanced Programming 38


Spring 2002
C preprocessor - ifdef
 For boolean flags, easier:
#ifdef name
code segment 1
#else
code segment 2
#endif
 preprocessor checks if name has been
defined
 #define USEDB
 if so, use code segment 1, otherwise 2

Feb 7, 2025 Advanced Programming 39


Spring 2002
Advice on preprocessor
 Limit use as much as possible
 subtle errors
 not visible in debugging
 code hard to read
 much of it is historical baggage
 there are better alternatives for almost
everything:
 #define INT16 -> type definitions
 #define MAXLEN -> const
 #define max(a,b) -> regular functions
 comment out code -> CVS, functions
 limit to .h files, to isolate OS & machine-specific
code
Feb 7, 2025 Advanced Programming 40
Spring 2002
Comments
 /* any text until */
 // C++-style comments – careful!
 no /** */, but doc++ has similar
conventions
 Convention for longer comments:
/*
* AverageGrade()
* Given an array of grades, compute the average.
*/

 Avoid **** boxes – hard to edit, usually


look ragged.
Feb 7, 2025 Advanced Programming 41
Spring 2002
Numeric data types
type bytes range
(typ.)
char 1 -128 … 127
short 2 -65536…65535
int, long 4 -2,147,483,648 to
2,147,483,647

long long 8 264

float 4 3.4E+/-38 (7 digits)

double 8 1.7E+/-308 (15


digits)

Feb 7, 2025 Advanced Programming 42


Spring 2002
Remarks on data types
 Range differs – int is “native” size, e.g.,
64 bits on 64-bit machines, but
sometimes int = 32 bits, long = 64
bits
 Also, unsigned versions of integer types
 same bits, different interpretation
 char = 1 “character”, but only true for
ASCII and other Western char sets

Feb 7, 2025 Advanced Programming 43


Spring 2002
Example
#include <stdio.h>

void main(void)
{
int nstudents = 0; /* Initialization, required */

printf(“How many students does Columbia


have ?:”);
scanf (“%d”, &nstudents); /* Read input */
printf(“Columbia has %d students.\n”, nstudents);

return ;
}

$ How many students does Columbia have ?: 20000 (enter)


Columbia has 20000 students.

Feb 7, 2025 Advanced Programming 44


Spring 2002
Type conversion

#include <stdio.h>
void main(void)
{
int i,j = 12; /* i not initialized, only j */
float f1,f2 = 1.2;

i = (int) f2; /* explicit: i <- 1, 0.2 lost */


f1 = i; /* implicit: f1 <- 1.0 */

f1 = f2 + (int) j; /* explicit: f1 <- 1.2 + 12.0 */


f1 = f2 + j; /* implicit: f1 <- 1.2 + 12.0 */
}

Feb 7, 2025 Advanced Programming 45


Spring 2002
Explicit and implicit
conversions
 Implicit: e.g., s = a (int) + b (char)
 Promotion: char -> short -> int -> …
 If one operand is double, the other is
made double
 If either is float, the other is made
float, etc.
 Explicit: type casting – (type)
 Almost any conversion does something
– but not necessarily what you intended

Feb 7, 2025 Advanced Programming 46


Spring 2002
Type conversion
int x = 100000;
short s;

s = x;
printf(“%d %d\n”, x, s);

100000 -31072

Feb 7, 2025 Advanced Programming 47


Spring 2002
C – no booleans
 C doesn’t have booleans
 Emulate as int or char, with values 0
(false) and 1 or non-zero (true)
 Allowed by flow control statements:
if (n = 0) {
printf(“something wrong”);
}

 Assignment returns zero -> false

Feb 7, 2025 Advanced Programming 48


Spring 2002
User-defined types
 typedef gives names to types:
typedef short int smallNumber;
typedef unsigned char byte;
typedef char String[100];

smallNumber x;
byte b;
String name;

Feb 7, 2025 Advanced Programming 49


Spring 2002
Defining your own boolean
typedef char boolean;
#define FALSE 0
#define TRUE 1
 Generally works, but beware:
check = x > 0;
if (check == TRUE) {…}
 If x is positive, check will be non-zero,
but may not be 1.

Feb 7, 2025 Advanced Programming 50


Spring 2002
Enumerated types
 Define new integer-like types as enumerated
types:
typedef enum {
Red, Orange, Yellow, Green, Blue, Violet
} Color;
enum weather {rain, snow=2, sun=4};
 look like C identifiers (names)
 are listed (enumerated) in definition
 treated like integers
 can add, subtract – even color + weather
 can’t print as symbol (unlike Pascal)
 but debugger generally will

Feb 7, 2025 Advanced Programming 51


Spring 2002
Enumerated types
 Just syntactic sugar for ordered
collection of integer constants:
typedef enum {
Red, Orange, Yellow
} Color;

is like
#define Red 0
#define Orange 1
#define Yellow 2
 typedef enum {False, True} boolean;

Feb 7, 2025 Advanced Programming 52


Spring 2002
Objects (or lack thereof)
 C does not have objects (C++ does)
 Variables for C’s primitive types are defined
very similarly:
short int x;
char ch;
float pi = 3.1415;
float f, g;
 Variables defined in {} block are active only in
block
 Variables defined outside a block are global
(persist during program execution), but may
not be globally visible (static)
Feb 7, 2025 Advanced Programming 53
Spring 2002
Data objects
 Variable = container that can hold a
value
 in C, pretty much a CPU word or similar
 default value is (mostly) undefined –
treat as random
 compiler may warn you about uninitialized
variables
 ch = ‘a’; x = x + 4;
 Always pass by value, but can pass
address to function:
scanf(“%d%f”, &x, &f);
Feb 7, 2025 Advanced Programming 54
Spring 2002
Data objects
 Every data object in C has
 a name and data type (specified in definition)
 an address (its relative location in memory)
 a size (number of bytes of memory it occupies)
 visibility (which parts of program can refer to it)
 lifetime (period during which it exists)
 Warning:
int *foo(char x) {
return &x;
}
pt = foo(x);
*pt = 17;

Feb 7, 2025 Advanced Programming 55


Spring 2002
Data objects
 Unlike scripting languages and Java, all
C data objects have a fixed size over
their lifetime
 except dynamically created objects
 size of object is determined when object
is created:
 global data objects at compile time (data)
 local data objects at run-time (stack)
 dynamic data objects by programmer
(heap)

Feb 7, 2025 Advanced Programming 56


Spring 2002
Data object creation
int x;
int arr[20];
int main(int argc, char *argv[]) {
int i = 20;
{into x; x = i + 7;}
}
int f(int n)
{
int a, *p;
a = 1;
p = (int *)malloc(sizeof int);
}

Feb 7, 2025 Advanced Programming 57


Spring 2002
Data object creation
 malloc() allocates a block of memory
 Lifetime until memory is freed, with
free().
 Memory leakage – memory allocated is
never freed:
char *combine(char *s, char *t) {
u = (char *)malloc(strlen(s) + strlen(t) + 1);
if (s != t) {
strcpy(u, s); strcat(u, t);
return u;
} else {
return 0;
}
}
Feb 7, 2025 Advanced Programming 58
Spring 2002
Memory allocation
 Note: malloc() does not initialize data
 void *calloc(size_t n, size_t elsize)
does initialize (to zero)
 Can also change size of allocated
memory blocks:
void *realloc(void *ptr, size_t size)
ptr points to existing block, size is new size
 New pointer may be different from old,
but content is copied.

Feb 7, 2025 Advanced Programming 59


Spring 2002
Memory layout of programs
0
Header info
100

Code
400
all malloc()s Data - Heap Dynamic memory
560

1010 Local memory


all normal vars Data - stack + function call
1200 stack
Feb 7, 2025 Advanced Programming 60
Spring 2002
Data objects and pointers
 The memory address of a data object, e.g.,
int x
 can be obtained via &x
 has a data type int * (in general, type *)
 has a value which is a large (4/8 byte) unsigned
integer
 can have pointers to pointers: int **
 The size of a data object, e.g., int x
 can be obtained via sizeof x or sizeof(x)
 has data type size_t, but is often assigned to int
(bad!)
 has a value which is a small(ish) integer
 is measured in bytes
Feb 7, 2025 Advanced Programming 61
Spring 2002
Data objects and pointers
 Every data type T in C/C++ has an
associated pointer type T *
 A value of type * is the address of an
object of type T
 If an object int *xp has value &x, the
expression *xp dereferences the pointer
and refers to x, thus has type int
xp x

&x 42
int * int
Feb 7, 2025 Advanced Programming 62
Spring 2002
Data objects and pointers
 If p contains the address of a data
object, then *p allows you to use that
object
 *p is treated just like normal data object
int a, b, *c, *d;
*d = 17; /* BAD idea */
a = 2; b = 3; c = &a; d = &b;
if (*c == *d) puts(“Same value”);
*c = 3;
if (*c == *d) puts(“Now same value”);
c = d;
if (c == d) puts (“Now same address”);
Feb 7, 2025 Advanced Programming 63
Spring 2002
void pointers
 Generic pointer
 Unlike other pointers, can be assigned
to any other pointer type:
void *v;
char *s = v;
 Acts like char * otherwise:
v++, sizeof(*v) = 1;

Feb 7, 2025 Advanced Programming 64


Spring 2002
Control structures
 Same as Java
 sequencing: ;
 grouping: {...}
 selection: if, switch
 iteration: for, while

Feb 7, 2025 Advanced Programming 65


Spring 2002
Sequencing and grouping
 statement1 ; statement2; statement n;
 executes each of the statements in turn
 a semicolon after every statement
 not required after a {...} block
 { statements} {declarations
statements}
 treat the sequence of statements as a single
operation (block)
 data objects may be defined at beginning of
block

Feb 7, 2025 Advanced Programming 66


Spring 2002
The if statement
 Same as Java
if (condition1) {statements1}
else if (condition 2) {statements2}
else if (condition n-1 ) {statements n-1 }|
else {statementsn}
 evaluates statements until find one with
non-zero result
 executes corresponding statements

Feb 7, 2025 Advanced Programming 67


Spring 2002
The if statement
 Can omit {}, but careful
if (x > 0)
printf(“x > 0!”);
if (y > 0)
printf(“x and y > 0!”);

Feb 7, 2025 Advanced Programming 68


Spring 2002
The switch statement
 Allows choice based on a single value
switch(expression) {
case const1: statements1; break;
case const2: statements2; break;
default: statementsn;
}
 Effect: evaluates integer expression
 looks for case with matching value
 executes corresponding statements (or
defaults)

Feb 7, 2025 Advanced Programming 69


Spring 2002
The switch statement
Weather w;
switch(w) {
case rain:
printf(“bring umbrella’’);
case snow:
printf(“wear jacket”);
break;
case sun:
printf(“wear sunscreen”);
break;
default:
printf(“strange weather”);
}

Feb 7, 2025 Advanced Programming 70


Spring 2002
Repetition
 C has several control structures for
repetition
Statement repeats an
action...
while(c) {} zero or more times,
while condition is 
0
do {...} while(c) one or more times,
while condition is 
0
for (start; cond; zero or more times,
upd) with initialization
Feb 7, 2025 and update
Advanced Programming 71
Spring 2002
The break statement
 break allows early exit from one loop
level
for (init; condition; next) {
statements1;
if (condition2) break;
statements2;
}

Feb 7, 2025 Advanced Programming 72


Spring 2002
The continue statement
 continue skips to next iteration,
ignoring rest of loop body
 does execute next statement
for (init; condition1; next) {
statement2;
if (condition2) continue;
statement2;
}
 often better written as if with block

Feb 7, 2025 Advanced Programming 73


Spring 2002
Structured data objects
 Structured data objects are available as
object property
array [] enumerated,
numbered from 0

struct names and types


of fields

union occupy same


space (one of)

Feb 7, 2025 Advanced Programming 74


Spring 2002
Arrays
 Arrays are defined by specifying an
element type and number of elements
 int vec[100];
 char str[30];
 float m[10][10];
 For array containing N elements,
indexes are 0..N-1
 Stored as linear arrangement of
elements
 Often similar to pointers

Feb 7, 2025 Advanced Programming 75


Spring 2002
Arrays
 C does not remember how large arrays are (i.e.,
no length attribute)
 int x[10]; x[10] = 5; may work (for a while)
 In the block where array A is defined:
 sizeof A gives the number of bytes in array
 can compute length via sizeof A /sizeof A[0]
 When an array is passed as a parameter to a
function
 the size information is not available inside the function
 array size is typically passed as an additional parameter
 PrintArray(A, VECSIZE);
 or as part of a struct (best, object-like)
 or globally
 #define VECSIZE 10

Feb 7, 2025 Advanced Programming 76


Spring 2002
Arrays
 Array elements are accessed using the same
syntax as in Java: array[index]
 Example (iteration over array):
int i, sum = 0;
...
for (i = 0; i < VECSIZE; i++)
sum += vec[i];
 C does not check whether array index values
are sensible (i.e., no bounds checking)
 vec[-1] or vec[10000] will not generate a compiler
warning!
 if you’re lucky, the program crashes with
Segmentation fault (core dumped)

Feb 7, 2025 Advanced Programming 77


Spring 2002
Arrays
 C references arrays by the address of
their first element
 array is equivalent to &array[0]
 can iterate through arrays using
pointers as well as indexes:
int *v, *last;
int sum = 0;
last = &vec[VECSIZE-1];
for (v = vec; v <= last; v++)
sum += *v;

Feb 7, 2025 Advanced Programming 78


Spring 2002
2-D arrays

 2-dimensional array
int weekends[52][2];

[0][0] [0][1] [1][0] [1][1] [2][0] [2][1] [3][0] . . . .

weekends

 weekends[2][1] is same as *(weekends+2*2+1)


 NOT *weekends+2*2+1 :this is an int !

Feb 7, 2025 Advanced Programming 79


Spring 2002
Arrays - example
#include <stdio.h>
void main(void) {
int number[12]; /* 12 cells, one cell per student */
int index, sum = 0;
/* Always initialize array before use */
for (index = 0; index < 12; index++) {
number[index] = index;
}
/* now, number[index]=index; will cause error:why ?*/

for (index = 0; index < 12; index = index + 1) {


sum += number[index]; /* sum array elements */
}
return;
}

Feb 7, 2025 Advanced Programming 80


Spring 2002
Aside: void, void *
 Function that doesn’t return anything
declared as void
 No argument declared as void
 Special pointer *void can point to
anything
#include <stdio.h>
extern void *f(void);
void *f(void) {
printf("the big void\n");
return NULL;
}
int main(void) {
f();
}
Feb 7, 2025 Advanced Programming 81
Spring 2002
Overriding functions –
function pointers
 overriding: changing the
implementation, leave prototype
 in C, can use function pointers
returnType (*ptrName)(arg1, arg2, ...);
 for example, int (*fp)(double x); is a
pointer to a function that return an
integer
 double * (*gp)(int) is a pointer to a
function that returns a pointer to a
double
Feb 7, 2025 Advanced Programming 82
Spring 2002
structs
 Similar to fields in Java object/class
definitions
 components can be any type (but not
recursive)
 accessed using the same syntax
struct.field
 Example:
struct {int x; char y; float z;} rec;
...
r.x = 3; r.y = ‘a’; r.z= 3.1415;

Feb 7, 2025 Advanced Programming 83


Spring 2002
structs
 Record types can be defined
 using a tag associated with the struct definition
 wrapping the struct definition inside a typedef
 Examples:
struct complex {double real; double imag;};
struct point {double x; double y;} corner;
typedef struct {double real; double imag;} Complex;
struct complex a, b;
Complex c,d;
 a and b have the same size, structure and type
 a and c have the same size and structure, but
different types

Feb 7, 2025 Advanced Programming 84


Spring 2002
structs
 Overall size is sum of elements, plus
padding for alignment:
struct {
char x;
int y;
char z;
} s1; sizeof(s1) = ?
struct {
char x, z;
int y;
} s2; sizeof(s2) = ?

Feb 7, 2025 Advanced Programming 85


Spring 2002
structs - example
struct person {
char name[41];
int age;
float height;
struct { /* embedded structure */
int month;
int day;
int year;
} birth;
};
struct person me;
me.birth.year=1977;
struct person class[60];
/* array of info about everyone in class */
class[0].name=“Gun”; class[0].birth.year=1971;……

Feb 7, 2025 Advanced Programming 86


Spring 2002
structs
 Often used to model real memory
layout, e.g.,
typedef struct {
unsigned int version:2;
unsigned int p:1;
unsigned int cc:4;
unsigned int m:1;
unsigned int pt:7;
u_int16 seq;
u_int32 ts;
} rtp_hdr_t;

Feb 7, 2025 Advanced Programming 87


Spring 2002
Dereferencing pointers to
struct elements
 Pointers commonly to struct’s
(*sp).element = 42;
y = (*sp).element;
 Note: *sp.element doesn’t work
 Abbreviated alternative:
sp->element = 42;
y = sp->element;

Feb 7, 2025 Advanced Programming 88


Spring 2002
Bit fields
 On previous slides, labeled integers with
size in bits (e.g., pt:7)
 Allows aligning struct with real memory
data, e.g., in protocols or device drivers
 Order can differ between little/big-
endian systems
 Alignment restrictions on modern
processors – natural alignment
 Sometimes clearer than (x & 0x8000) >>
31
Feb 7, 2025 Advanced Programming 89
Spring 2002
Unions
 Like structs:
union u_tag {
int ival;
float fval;
char *sval;
} u;
 but occupy same memory space
 can hold different types at different
times
 overall size is largest of elements

Feb 7, 2025 Advanced Programming 90


Spring 2002
More pointers
int month[12]; /* month is a pointer to base address 430*/

month[3] = 7; /* month address + 3 * int elements


=> int at address (430+3*4) is now 7 */

ptr = month + 2; /* ptr points to month[2],


=> ptr is now (430+2 * int elements)= 438 */
ptr[5] = 12; /* ptr address + 5 int elements
=> int at address (434+5*4) is now 12.
Thus, month[7] is now 12 */

ptr++; /* ptr <- 438 + 1 * size of int = 442 */


(ptr + 4)[2] = 12; /* accessing ptr[6] i.e., array[9] */

 Now , month[6], *(month+6), (month+4)[2],


ptr[3], *(ptr+3) are all the same integer
variable.
Feb 7, 2025 Advanced Programming 91
Spring 2002
Functions - why and how ?
 If a program is too  Passing arguments
long to functions
 Modularization –  By value
easier to  By reference

• code  Returning values


• debug from functions
 By value
 Code reuse
 By reference

Feb 7, 2025 Advanced Programming 92


Spring 2002
Functions
 Prototypes and functions (cf. Java
interfaces)
 extern int putchar(int c);
 putchar(‘A’);
 int putchar(int c) {
do something interesting here
}
 If defined before use in same file, no need
for prototype
 Typically, prototype defined in .h file
 Good idea to include <.h> in actual
definition
Feb 7, 2025 Advanced Programming 93
Spring 2002
Functions
 static functions and variables hide them
to those outside the same file:
static int x;
static int times2(int c) {
return c*2;
}
 compare protected class members in
Java.

Feb 7, 2025 Advanced Programming 94


Spring 2002
Functions – const arguments
 Indicates that argument won’t be
changed.
 Only meaningful for pointer arguments
and declarations:
int c(const char *s, const int x) {
const int VALUE = 10;
printf("x = %d\n", VALUE);
return *s;
}
 Attempts to change *s will yield
compiler warning.
Feb 7, 2025 Advanced Programming 95
Spring 2002
Functions - extern
#include <stdio.h>

extern char user2line [20]; /* global variable defined


in another file */
char user1line[30]; /* global for this file */
void dummy(void);

void main(void) {
char user1line[20]; /* different from earlier
user1line[30] */
. . . /* restricted to this func */
}

void dummy(){
extern char user1line[]; /* the global user1line[30] */
. . .
}

Feb 7, 2025 Advanced Programming 96


Spring 2002
Overloading functions – var.
arg. list
 Java:
void product(double x, double y);
void product(vector x, vector y);
 C doesn’t support this, but allows
variable number of arguments:
debug(“%d %f”, x, f);
debug(“%c”, c);
 declared as void debug(char
*fmt, ...);
 at least one known argument

Feb 7, 2025 Advanced Programming 97


Spring 2002
Overloading functions
 must include <stdarg.h>:
#include <stdarg.h>
double product(int number, ...) {
va_list list;
double p;
int i;
va_start(list, number);
for (i = 0, p = 1.0; i < number; i++) {
p *= va_arg(list, double);
}
va_end(list);
}
 danger: product(2,3,4) won’t work, needs
product(2,3.0,4.0);

Feb 7, 2025 Advanced Programming 98


Spring 2002
Overloading functions
 Limitations:
 cannot access arguments in middle
 needs to copy to variables or local array
 client and function need to know and
adhere to type

Feb 7, 2025 Advanced Programming 99


Spring 2002
Program with multiple files
#include <stdio.h> #include <stdio.h>
#include “mypgm.h” #include “mypgm.h”

void main(void) void myproc(void)


{ {
myproc(); mydata=2;
} . . . /* some code */
}

hw.c mypgm.c

 Library headers void myproc(void);


 Standard int mydata;
 User-defined
mypgm.h
Feb 7, 2025 Advanced Programming 100
Spring 2002
Data hiding in C
 C doesn’t have classes or private members, but this can
be approximated
 Implementation defines real data structure:
#define QUEUE_C
#include “queue.h”
typedef struct queue_t {
struct queue_t *next;
int data;
} *queue_t, queuestruct_t;
queue_t NewQueue(void) {
return q;
}
 Header file defines public data:
#ifndef QUEUE_C
typedef struct queue_t *queue_t;
#endif
queue_t NewQueue(void);

Feb 7, 2025 Advanced Programming 101


Spring 2002
Pointer to function

int func(); /*function returning integer*/


int *func(); /*function returning pointer to integer*/
int (*func)(); /*pointer to function returning integer*/
int *(*func)(); /*pointer to func returning ptr to int*/

Feb 7, 2025 Advanced Programming 102


Spring 2002
Function pointers
int (*fp)(void);
double* (*gp)(int);
int f(void)
double *g(int);

fp=f;
gp=g;

int i = fp();
double *g = (*gp)(17); /* alternative */

Feb 7, 2025 Advanced Programming 103


Spring 2002
Pointer to function - example
#include <stdio.h>

void myproc (int d);


void mycaller(void (* f)(int), int param);

void main(void) {
myproc(10); /* call myproc with parameter 10*/
mycaller(myproc, 10); /* and do the same again ! */
}

void mycaller(void (* f)(int), int param){


(*f)(param); /* call function *f with param */
}

void myproc (int d){


. . . /* do something with d */
}
Feb 7, 2025 Advanced Programming 104
Spring 2002
Libraries
 C provides a set of standard libraries for
numerical <math.h> -lm
math
functions
character <string.h>
strings
character <ctype.h>
types
I/O <stdio.h>

Feb 7, 2025 Advanced Programming 105


Spring 2002
The math library
 #include <math.h>
 careful: sqrt(5) without header file may
give wrong result!
 gcc –o compute main.o f.o –lm
 Uses normal mathematical notation:
Math.sqrt(2) sqrt(2)
Math.pow(x,5) pow(x,5)
4*math.pow(x,3) 4*pow(x,3)

Feb 7, 2025 Advanced Programming 106


Spring 2002
Characters
 The char type is an 8-bit byte containing ASCII
code values (e.g., ‘A’ = 65, ‘B’ = 66, ...)
 Often, char is treated like (and converted to)
int
 <ctype.h> contains character classification
isalnum(ch)
functions: alphanumeric [a-zA-Z0-9]
isalpha (ch) alphabetic [a-zA-Z]
isdigit(ch) digit [0-9]
ispunct(ch) punctuation [~!@#%^&...]
isspace(ch) white space [ \t\n]
isupper(ch) upper-case [A-Z]
islower(ch) lower-case [a-z]
Feb 7, 2025 Advanced Programming 107
Spring 2002
Strings
 In Java, strings are regular objects
 In C, strings are just char arrays with a NUL
(‘\0’) terminator
 “a cat” = a c a t \0
 A literal string (“a cat”)
 is automatically allocated memory space to contain it
and the terminating \0
 has a value which is the address of the first
character
 can’t be changed by the program (common bug!)
 All other strings must have space allocated to
them by the program

Feb 7, 2025 Advanced Programming 108


Spring 2002
Strings
char *makeBig(char *s) {
s[0] = toupper(s[0]);
return s;
}
makeBig(“a cat”);

Feb 7, 2025 Advanced Programming 109


Spring 2002
Strings
 We normally refer to a string via a pointer to
its first character:
char *str = “my string”;
char *s;
s = &str[0]; s = str;
 C functions only know string ending by \0:
char *str = “my string”;
...
int i;
for (i = 0; str[i] != ‘\0’; i++)
putchar(str[i]);
char *s;
for (s = str; *s; s++) putchar(*s);

Feb 7, 2025 Advanced Programming 110


Spring 2002
Strings
 Can treat like arrays:
char c;
char line[100];
for (i = 0; i < 100 && line[c]; i++) {
if (isalpha(line[c]) ...
}

Feb 7, 2025 Advanced Programming 111


Spring 2002
Copying strings
 Copying content vs. copying pointer to
content
 s = t copies pointer – s and t now refer
to the same memory location
 strcpy(s, t); copies content of t to s
char mybuffer[100];
...
mybuffer = “a cat”;
 is incorrect (but appears to work!)
 Use strcpy(mybuffer, “a cat”) instead
Feb 7, 2025 Advanced Programming 112
Spring 2002
Example string manipulation
#include <stdio.h>
#include <string.h>
int main(void) {
char line[100];
char *family, *given, *gap;
printf(“Enter your name:”); fgets(line,100,stdin);
given = line;
for (gap = line; *gap; gap++)
if (isspace(*gap)) break;
*gap = ‘\0’;
family = gap+1;
printf(“Your name: %s, %s\n”, family, given);
return 0;
}

Feb 7, 2025 Advanced Programming 113


Spring 2002
string.h library
 Assumptions:
 #include <string.h>
 strings are NUL-terminated
 all target arrays are large enough
 Operations:
 char *strcpy(char *dest, char *source)
 copies chars from source array into dest array up
to NUL
 char *strncpy(char *dest, char *source, int
num)
 copies chars; stops after num chars if no NUL
before that; appends NUL
Feb 7, 2025 Advanced Programming 114
Spring 2002
string.h library
 int strlen(const char *source)
 returns number of chars, excluding NUL
 char *strchr(const char *source, const
char ch)
 returns pointer to first occurrence of ch in
source; NUL if none
 char *strstr(const char *source, const
char *search)
 return pointer to first occurrence of search
in source

Feb 7, 2025 Advanced Programming 115


Spring 2002
Formatted strings
 String parsing and formatting (binary from/to
text)
 int sscanf(char *string, char *format, ...)
 parse the contents of string according to format
 placed the parsed items into 3rd, 4th, 5th, ... argument
 return the number of successful conversions
 int sprintf(char *buffer, char *format, ...)
 produce a string formatted according to format
 place this string into the buffer
 the 3rd, 4th, 5th, ... arguments are formatted
 return number of successful conversions

Feb 7, 2025 Advanced Programming 116


Spring 2002
Formatted strings
 The format strings for sscanf and
sprintf contain
 plain text (matched on input or inserted into
the output)
 formatting codes (which must match the
arguments)
 The sprintf format string gives
template for result string
 The sscanf format string describes
what input should look like
Feb 7, 2025 Advanced Programming 117
Spring 2002
Formatted strings
 Formatting codes for sscanf
Code meaning variabl
e
%c matches a single character char

%d matches an integer in decimal int

%f matches a real number float


(ddd.dd)
%s matches a string up to white char *
space
%[^c] matches string up to next c char *
char

Feb 7, 2025 Advanced Programming 118


Spring 2002
Formatted strings
 Formatting codes for sprintf
 Values normally right-justified; use negative field width
to get left-justified
Code meaning variable
%nc char in field of n spaces char
%nd integer in field of n spaces int, long
%n.mf real number in width n, m float, double
decimals
%n.mg real number in width n, m float, double
digits of precision
%n.ms first m chars from string in char *
width n

Feb 7, 2025 Advanced Programming 119


Spring 2002
Formatted strings - examples
char *msg = “Hello there”;
char *nums = “1 3 5 7 9”;
char s[10], t[10];
int a, b, c, n;

n = sscanf(msg, “%s %s”, s, t);


n = printf(“%10s %-10s”, t, s);
n = sscanf(nums, “%d %d %d”, &a, &b, &c);

printf(“%d flower%s”, n, n > 1 ? “s” : “ “);


printf(“a = %d, answer = %d\n”, a, b+c);

Feb 7, 2025 Advanced Programming 120


Spring 2002
The stdio library
 Access stdio functions by
 using #include <stdio.h> for prototypes
 compiler links it automatically
 defines FILE * type and functions of that
type
 data objects of type FILE *
 can be connected to file system files for
reading and writing
 represent a buffered stream of chars (bytes)
to be written or read
 always defines stdin, stdout, stderr
Feb 7, 2025 Advanced Programming 121
Spring 2002
The stdio library: fopen(),
fclose()
 Opening and closing FILE * streams:
FILE *fopen(const char *path, const char
*mode)
 open the file called path in the appropriate mode
 modes: “r” (read), “w” (write), “a” (append), “r+”
(read & write)
 returns a new FILE * if successful, NULL otherwise
int fclose(FILE *stream)
 close the stream FILE *
 return 0 if successful, EOF if not

Feb 7, 2025 Advanced Programming 122


Spring 2002
stdio – character I/O
int getchar()
 read the next character from stdin; returns
EOF if none
int fgetc(FILE *in)
 read the next character from FILE in; returns
EOF if none
int putchar(int c)
 write the character c onto stdout; returns c or
EOF
int fputc(int c, FILE *out)
 write the character c onto out; returns c or EOF
Feb 7, 2025 Advanced Programming 123
Spring 2002
stdio – line I/O
char *fgets(char *buf, int size, FILE *in)
 read the next line from in into buffer buf
 halts at ‘\n’ or after size-1 characters have
been read
 the ‘\n’ is read, but not included in buf
 returns pointer to strbuf if ok, NULL otherwise
 do not use gets(char *) – buffer overflow
int fputs(const char *str, FILE *out)
 writes the string str to out, stopping at ‘\0’
 returns number of characters written or EOF

Feb 7, 2025 Advanced Programming 124


Spring 2002
stdio – formatted I/O
int fscanf(FILE *in, const char *format, ...)
 read text from stream according to format
int fprintf(FILE *out, const char *format, ...)
 write the string to output file, according to
format
int printf(const char *format, ...)
 equivalent to fprintf(stdout, format, ...)
 Warning: do not use fscanf(...); use
fgets(str, ...); sscanf(str, ...);

Feb 7, 2025 Advanced Programming 125


Spring 2002
Before you go….
 Always initialize anything before using it (especially
pointers)
 Don’t use pointers after freeing them
 Don’t return a function’s local variables by reference
 No exceptions – so check for errors everywhere
 memory allocation
 system calls
 Murphy’s law, C version: anything that can’t fail, will fail
 An array is also a pointer, but its value is immutable.

Feb 7, 2025 Advanced Programming 126


Spring 2002

You might also like