1 / 43

Strings, Arrays, and Pointers

Strings, Arrays, and Pointers. CS-2301, System Programming for Non-Majors (Slides include materials from The C Programming Language , 2 nd edition, by Kernighan and Ritchie and from C: How to Program , 5 th and 6 th editions, by Deitel and Deitel). Reading Assignment.

holland
Download Presentation

Strings, Arrays, and Pointers

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Strings, Arrays, and Pointers CS-2301, System Programmingfor Non-Majors (Slides include materials from The C Programming Language, 2nd edition, by Kernighan and Ritchie and from C: How to Program, 5th and 6th editions, by Deitel and Deitel) Strings, Arrays, and Pointers

  2. Reading Assignment • Kernighan & Ritchie, Chapter 5 • All the way through! • Study§5.5 in detail — pages 104-107 • Character pointer and functions • You will use this all the time! • Study§5.10 — pages 114-118 • Command line arguments • You will use this a lot! Strings, Arrays, and Pointers

  3. Review • Array – a set of elements all of the same type stored contiguously in memory – e.g., • int A[25]; // 25 integers • struct Str B[15]; /* 15 objects of type struct Str */ • double C[]; /* indeterminate # of doubles */ • Pointer – a variable whose value is the location of some other object • float *p; // pointer to a float Strings, Arrays, and Pointers

  4. Review (continued) int A[25]; // 25 integers • Type of A[i] is int (for all i). • Type of A is int * • I.e., pointer to int Strings, Arrays, and Pointers

  5. Review (continued) • '&' operator generates a pointer to its operand – e.g., • int n; • Type of &n is int * • Unary '*' operator dereferences a pointer –i.e., accesses the thing pointed to – e.g., • int *p; • Type of *p is int Strings, Arrays, and Pointers

  6. Review (continued) • Arrays and pointers are closely related • Let int A[25];int *p; int i, j; • Let p = A; • Then p points to A[0]p + i points to A[i]&A[j] == p+j*(p+j) is the same as A[j] Strings, Arrays, and Pointers

  7. Review (continued) • If void f(int A[], int arraySize); • Then f(&B[i], bSize-i) calls f with subarray of B as argument • Starting at element i, continuing for bSize-i elements Strings, Arrays, and Pointers

  8. Review (concluded) void f(int A[], int arraySize); and • void f(int *A, int arraySize); are identical! • Most C programmers use pointer notation rather than array notation • In these kinds of situations Strings, Arrays, and Pointers

  9. Additional Notes • A pointer is not an integer … • Not necessarily the same size • May not be assigned to each other • … except for value of zero! • Called NULL in C; defined in <stdio.h> • Means “pointer to nowhere” • void * is a pointer to no type at all • May be assigned to any pointer type • Any pointer type may be assigned to void * Strings, Arrays, and Pointers

  10. Defeats type-checking in the compiler A easy way to get into big trouble Absolutely necessary in most large C programs Additional Notes • A pointer is not an integer … • Not necessarily the same size • May not be assigned to each other • … except for value of zero! • Called NULL in C; defined in <stdio.h> • Means “pointer to nowhere” • void * is a pointer to no type at all • May be assigned to any pointer type • Any pointer type may be assigned to void * Strings, Arrays, and Pointers

  11. Questions? Strings, Arrays, and Pointers

  12. Characters in C • char is a one-byte data type capable of holding a character • Treated as an arithmetic integer type • (Usually) unsigned • May be used in arithmetic expressions • Add, subtract, multiply, divide, etc. • Character constants • 'a', 'b', 'c', …'z', '0', '1', … '9', '+', '-', '=', '!', '~', etc, '\n', '\t', '\0', etc. • A-Z, a-z, 0-9 are in order, so that arithmetic can be done Strings, Arrays, and Pointers

  13. Strings in C • Definition:–A string is a character array ending in '\0' — i.e., • char s[256]; • char t[] = "This is an initialized string!"; • char *u = "This is another string!"; • String constants are in double quotes • May contain any characters • Including \" and \' — see p. 38, 193 • String constants may not span lines • However, they may be concatenated — e.g., "Hello, " "World!\n" is the same as "Hello, World!\n" Strings, Arrays, and Pointers

  14. Strings in C(continued) • Let • char *u = "This is another string!"; • Then • u[0] == 'T'u[1] == 'h'u[2] == 'i'…u[21] == 'g'u[22] == '!'u[23] == '\0' Strings, Arrays, and Pointers

  15. Support for Strings in C • Most string manipulation is done through functions in <string.h> • String functions depend upon final '\0' • So you don’t have to count the characters! • Examples:– • int strlen(char *s) – returns length of string • Excluding final '\0' • char* strcpy(char *s, char *ct) – Copies string ct to string s, return s • s must be big enough to hold contents of ct • ct may be smaller than s • See pp. 105-106 for various implementations Strings, Arrays, and Pointers

  16. Support for Strings in C(continued) • Examples (continued):– • int strcmp(char *s, char *t) • lexically compares s and t, returns <0 if s < t, >0 ifs > t, zero if s and t are identical (p. 106) • char* strcat(char *s, char *ct) • Concatenates string ct to onto end of string s, returns s • s must be big enough to hold contents of both strings! • Other string functions • strchr(), strrchr(), strspn(), strcspn() strpbrk(), strstr(), strtok(), … • pp. 249-250 Strings, Arrays, and Pointers

  17. Character functions in C • See <ctype.h>, p. 248-249 • These return or false (0) or true (non-zero) int isdigit(int c) int isalpha(int c) int isalnum(int c) int isxdigit(int c) int islower(int c) int isupper(int c) int isspace(int c) int iscntrl(int c) int ispunct(int c) int isprint(int c) int isgraph(int c) • These change case (if appropriate) int toupper(int c) int tolower(int c) Strings, Arrays, and Pointers

  18. String Conversion Functions in C • See <stdlib.h>, p. 251-252 double atof(const char *s) int atoi(const char *s) long atol(const char *s) double strtod(const char *s, char **endp) long strtol(const char *s, char **endp, int base) unsigned long strtoul(const char *s, char **endp, int base) Strings, Arrays, and Pointers

  19. Dilemma • Question:– • If strings are arrays of characters, … • and if arrays cannot be returned from functions, … • how can we manipulate variable length strings and pass them around our programs? • Answer:– • Use storage allocated in The Heap! Strings, Arrays, and Pointers

  20. Definition — The Heap • A region of memory provided by most operating systems for allocating storage not in Last in, First out discipline • I.e., not a stack • Must be explicitly allocated and released • May be accessed only with pointers • Remember, an array is equivalent to a pointer • Many hazards to the C programmer Strings, Arrays, and Pointers

  21. 0xFFFFFFFF stack (dynamically allocated) SP heap (dynamically allocated) address space static data program code (text) PC 0x00000000 This is The Heap. Static Data Allocation Strings, Arrays, and Pointers

  22. Allocating Memory in The Heap • See <stdlib.h>, p. 251-252 void *malloc(size_t size); void free(void *ptr); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); • malloc() — allocates size bytes of memory from the heap and returns a pointer to it. • NULL pointer if allocation fails for any reason • free() — returns the chunk of memory pointed to by ptr • Must have been allocated by malloc or calloc Strings, Arrays, and Pointers

  23. Segmentation fault and/or big-time error if bad pointer Allocating Memory in The Heap • See <stdlib.h>, p. 251-252 void *malloc(size_t size); void free(void *ptr); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); • malloc() — allocates size bytes of memory from the heap and returns a pointer to it. • NULL pointer if allocation fails for any reason • free() — returns the chunk of memory pointed to by ptr • Must have been allocated by malloc or calloc Strings, Arrays, and Pointers

  24. free() knows size of chunk allocated by malloc() or calloc() Allocating Memory in The Heap • See <stdlib.h>, p. 251-252 void *malloc(size_t size); void free(void *ptr); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); • malloc() — allocates size bytes of memory from the heap and returns a pointer to it. • NULL pointer if allocation fails for any reason • free() — returns the chunk of memory pointed to by ptr • Must have been allocated by malloc or calloc Strings, Arrays, and Pointers

  25. Notes • calloc() is just a variant of malloc() • malloc() is analogous to new in C++ and Java • new in C++ actually calls malloc() • free() is analogous to delete in C++ • delete in C++ actually calls free() • Java does not have delete — uses garbage collection to recover memory no longer in use Strings, Arrays, and Pointers

  26. Typical usage of malloc() and free() char *getTextFromSomewhere(…); int main free(){ char * txt; …; txt = getTextFromSomewhere(…); …; printf("The text returned is %s.", txt); free(txt); } Strings, Arrays, and Pointers

  27. getTextFromSomewhere() creates a new string using malloc() Typical usage of malloc() and free() char * getTextFromSomewhere(…){char *t;...t = malloc(stringLength);...return t; } int main free(){ char * txt; …; txt = getTextFromSomewhere(…); …; printf("The text returned is %s.", txt); free(txt); } Strings, Arrays, and Pointers

  28. Pointer to text is assigned to txt in calling function Typical usage of malloc() and free() char * getTextFromSomewhere(…){char *t;...t = malloc(stringLength);...return t; } int main free(){ char * txt; …; txt = getTextFromSomewhere(…); …; printf("The text returned is %s.", txt); free(txt); } Strings, Arrays, and Pointers

  29. main() must remember to free the storage pointed to by txt Usage of malloc() and free() char *getText(…){char *t;...t = malloc(stringLength);...return t; } int main free(){ char * txt; …; txt = getText(…); …; printf("The text returned is %s.", txt); free(txt); } Strings, Arrays, and Pointers

  30. Definition – Memory Leak • The steady loss of available memory due to forgetting to free() everything that was malloc’ed. • Bug-a-boo of most large C programs • If you “forget” the value of a pointer to a piece of malloc’ed memory, there is no way to find it again! • Killing the program frees all memory! Strings, Arrays, and Pointers

  31. Questions? Strings, Arrays, and Pointers

  32. String Manipulation in C • Almost all C programs that manipulate text do so with malloc’ed and free’d memory • No limit on size of string in C • Need to be aware of sizes of character arrays! • Need to remember to free storage when it is no longer needed • Before forgetting pointer to that storage! Strings, Arrays, and Pointers

  33. Input-Output Functions • printf(const char *format, ...) • Format string may contain %s – inserts a string argument (i.e., char *) up to trailing '\0' • scanf(const char *format, ...) • Format string may contain %s – scans a string into argument (i.e., char *) up to next “white space” • Adds '\0' • Related functions • fprintf(), fscanf() – to/from a file • sprintf(), sscanf() – to/from a string Strings, Arrays, and Pointers

  34. Example Hazard char word[20]; …; scanf("%s", word); • scanf will continue to scan characters from input until a space, tab, new-line, or EOF is detected • An unbounded amount of input • May overflow allocated character array • Probable corruption of data! • scanfadds trailing'\0' • Solution:– scanf("%19s", word); Strings, Arrays, and Pointers

  35. Questions? Programming Assignment #4 Strings, Arrays, and Pointers

  36. An array of pointers to char (i.e., of strings) Command Line Arguments • See §5.10 • By convention, main takes two arguments:- int main(int argc, char *argv[]); • argc is number of arguments • argv[0] is string name of program itself • argv[i] is argument i in string form • i.e., i < argc • argv[argc] is null pointer! • Sometimes you will see (the equivalent) int main(int argc, char **argv); Strings, Arrays, and Pointers

  37. argv[0] – name of program Example — PA #4 • Instead of prompting user for # of items to read, simply take it from command line % statistics 1000 would create an array of 1000 items, play 1000 games and store the results of those games in the array. Strings, Arrays, and Pointers

  38. argv[1] – first program argument Example — PA #4 (continued) • Instead of prompting user for # of items to read, simply take it from command line % statistics 1000 would create an array of 1000 items, play 1000 games and store the results of those games in the array. Strings, Arrays, and Pointers

  39. Example — PA #4 (continued) int main(int argc, char *argv[])){ int nElements; double array[]; if (argc <= 1) { printf(“Enter number of games:- "); scanf(“%d”, &nElements); } else nElements = atoi(argv[1]); array = calloc(nElements, sizeof double); /* rest of program using array[i] */ free(array); return 0; } // main(argc, argv) Strings, Arrays, and Pointers

  40. array of unknown size declared; no storage allocated Example — PA #4 (continued) int main(int argc, char *argv[])){ int nElements; double array[]; if (argc <= 1) { printf(“Enter number of games:- "); scanf(“%d”, &nElements); } else nElements = atoi(argv[1]); array = calloc(nElements, sizeof double); /* rest of program using array[i] */ free(array); return 0; } // main(argc, argv) Strings, Arrays, and Pointers

  41. Convert argument #1 to int for # of elements Allocate nElements of double, store pointer in array Example — PA #4 (continued) int main(int argc, char *argv[])){ int nElements; double array[]; if (argc <= 1) { printf(“Enter number of games:- "); scanf(“%d”, &nElements); } else nElements = atoi(argv[1]); array = calloc(nElements, sizeof double); /* rest of program using array[i] */ free(array); return 0; } // main(argc, argv) Strings, Arrays, and Pointers

  42. Be sure to free() the allocated array before exiting! Example — PA #4 (continued) int main(int argc, char *argv[])){ int nElements; double array[]; if (argc <= 1) { printf(“Enter number of games:- "); scanf(“%d”, &nElements); } else nElements = atoi(argv[1]); array = calloc(nElements, sizeof double); /* rest of program using array[i] */ free(array); return 0; } // main(argc, argv) Strings, Arrays, and Pointers

  43. Questions? Strings, Arrays, and Pointers

More Related