I. partitioning of memory storage areas :
1. Stack area : The stack area mainly stores variables , arrays defined inside the function . function call , open space , function execution complete , reclaim space , space opening and recycling have System management .
2. Heap Area : The largest feature of the heap area : the opening and release of space has developers manually managed .
3. Global zone static zone : The main storage function outside the definition of global variables and static variables , space once opened , will not be recycled . Until the end of application execution .
4. constant Area : Storage Constants . 1. Shaping Constants . 2. Floating-point constant. 3, string constant . 4. String Constants .
5. Code Area : The CPU instructions generated after the program is compiled .
Two. malloc, which opens up space in the heap area.
Open up space in the heap area. void * Generics: can represent all pointer types. If you want to store two integers, use int *, store 8 characters, use char *, store 4 person integers, with short *. malloc opens an N-byte space in the heap area, returning the first address of the space. Char *p = malloc (8); Store iphone strcpy (P, "iphome"); printf ("%s\n", p);//iphome //Free space //Delete just mark Delete, not clear the contents of the space. Free (p); p = NULL;
Three. Space problems in the heap area.
1. Wild pointer problem : access to space without ownership .
2. over-release : Once a space is released several times , the program crash immediately .
3. memory leak : space is not released, causing memory to accumulate . will not cause immediate crash, Security risks .
Processing method: P = NULL;
Prerequisites for using pointers: 1. the pointer should be directed by a clear point .
2. point to a controllable area
Four. malloc Application
1. An array space with 5 elements . Stores 5 integers .
int *p = malloc (sizeof (int.)); for (int i = 0; i < 5; i++) { P[i] = arc4random ()% (40-20 + 1) +; printf ("%d", P[i]); } printf ("\ n"); Sort for (int i = 0, i < 5-1; i++) {for (int j = 0; J < 5-1-I, J + +) { if (P[j] > p[j + 1]) { int temp = p[j]; P[J] = p[j + 1]; P[j + 1] = temp;}} } for (int i = 0; i < 5; i++) { printf ("%d", P[i]); } Free (p); p = NULL;
2. There is a string,which contains numbers,Extracting numbers from them,Requires dynamic allocation of memory storage.
printf ("Please enter a string: \ n"); Char str[] = {0}; scanf ("%s", str); int i = 0; int num = 0; while (str[i]! = ' + ') { if (str[i] >= ' 0 ' && str[i] <= ' 9 ') { num++; } i++; } Char *q = malloc (sizeof (char) * (num+1));//Generate space based on length num + 1 string hidden by int m = 0,n = 0; for (int i = 0, i < num; i++) {while (str[m]! = ') { if (str[m] >= ' 0 ' && str[m] <= ' 9 ') { C17/>q[n] = str[m]; n++; } m++; } } Q[n] = ' + ';//More Out of storage ("\ n"); for (int i = 0; i < num; i++) { printf ("%c", Q[i]); } Free (q); Q = NULL;
3. Enter the name of the 3 learners , dynamically allocate memory to save the learner name, and at the end of the output .
Char *names[3] = {0}; The first address of the space stored in the heap area. Char temp[255] = {0};//stores the string input from the console for (int i = 0; i < 3; i++) { printf ("Please enter the names of 3 students"); scanf ("%s", temp);//input into temp temporary array. Dynamically computes the length of the input string unsigned long length = strlen (temp); Open up space in the heap area. Names[i] = malloc (length + 1);//stores the address of the heap space in an array of pointers, //copies the contents to the heap area. strcpy (Names[i], temp); } for (int i = 0; i < 3; i++) { printf ("%s \ n", Names[i]); Free (names[i]); <span style= "font-family:arial, Helvetica, Sans-serif;" >//release of Space </span> names[i] = NULL; }
(2) Calloc usage
1.void * CALLOC (unsigned n, unsigned size); Allocates n sizes of size space. And clear all bytes of that memory by 0. int *p = Calloc (5, 4);//Allocate 5 block size to 4 bytes of space, and do clear 0 operation. Free (p); p = NULL;
(3) ReAlloc usage
void *realloc (void *p,unsigned newSize); int *p = malloc (ten); printf ("%p\n", p); int *q = ReAlloc (P, 40);//reassign a space of size 100. ReAlloc returns the first address of the current space. If the current space is not enough, then another chunk is requested for 20 bytes of space, at which point the address of the new space is returned. printf ("%p\n", q); Free (q); Q = NULL; p = null;//does not need to be released.
(4) memcpy usage
void *memcpy (void *dest, const void *source, size_t n); From source, point to memory and start copying to n bytes in dest. Char *p1 = malloc (8); Char *p2 = malloc (8); strcpy (P2, "Frank"); printf ("%s\n", p2); memcpy (P1, p2, 6); memcpy (P1, P2, 4); memcpy (P1, p2 + 2, 4);//ank p1[4] = ' + '; printf ("%s\n", p1);//fran
(5) Memset usage
<pre name= "code" class= "CPP" >4. void * memset (void *s, int c, size_t n); The memory starting from S points to initialize n bytes of content for C char *p1 = malloc (8); memset (p1,0,8);
Five. Practice
Define two integer pointers, save 3 elements with malloc,calloc for their allocated space, andmalloc allocated space with memset zeroed, The random array is assigned a random range 1-3, and the value is compared with memcmp two arrays. If the same print good! Otherwise print Failed.
int *p = malloc (sizeof (int) * 3); int *q = calloc (3, sizeof (int)); memset (p, 0, sizeof (int) * 3); for (int i = 0;i < 3;i++) { P[i] = arc4random ()% (3-1 + 1) + 1; Q[i] = arc4random ()% (3-1 + 1) + 1; printf ("p:%d q:%d\n", P[i],q[i]); } Compare whether Buf1 and Buf2 point to the same memory, compare count bytes if (memcmp (p, q, sizeof (int) * 3) = = 0) {//address. 3 is 3 bytes. printf ("profect\n"); } else { printf ("failed\n"); } Free (p); Free (q); p = NULL; Q = NULL;
Six. Macros
define macros : three parts : 1. #define 2. Macro Name 3. What to replace
The function of a macro : replace only .
Naming conventions for macro names : 1. All CAPS 2. K + Hump
no parameter macro #define Karraynumber5 #define N
#define MUL (a) (a) * (B))
The macro should be aware of several issues .
1. Macro Name Capitalization
2. The parameters must be enclosed in parentheses .
3. do not add a semicolon to the contents of the macro replacement .
4. for a parameter macro , do not add a space between the macro name and the parameter .
Seven. Enumeration
Defining enumerations
The role of enumerations : list out all possibilities
Enumeration is the combination of identifiers that people can recognize and numbers that a computer can recognize .
Example:
Defines an enumeration typedef enum BUTTON { //by 1 for each bit to represent a state. Close = 1 << 0,//off 001 first bit 1 means off Max = 1 << 1,//Maximize 010 The second bit is 1 means maximize min = 1 << 2//Minimize 1 the third digit of 1 indicates the minimization of }button;
If you want to baby more than one enumeration value, bitwise or can, provided that the enumeration value is shifted by the left symbol corresponding to the value. BOOL B = Close | Max | Min; 001 010 = 111 printf ("%d\n", b);
Eight. Conditional compilation
Start with # is called pre-compilation instructions
Precompiled directives do some textual work and replace the code .
Form 1:
#define A#IFDEF a int a = 10;//conditional compilation (different code compiled according to the conditions) #else int A = +; #endif printf ("%d", A);//10
Form 2:
#define A#IFNDEF A//If you do not define an int a = 10;//conditional compilation (different code compiled according to the conditions) #else int a = +; #endif printf ("%d\n", A);//20
Form 3:
# if 10//Non 0 is true, execute if, otherwise false, execute else int a = ten, #else int b =: #endif printf ("%d\n", a);//10
Nine.Face Test#includewith the#importthe Difference
#import #include prevents duplicate imports , resulting in cross-compilation .
#import "" to import a custom header file
header file for #impoer <> import System
"Learning the path to iOS: C-language" storage memory partitioning