android ndk 03 C语言动态分配内存,字符串操作

xiaoxiao2021-02-28  101

动态分配内存,字符串操作

动态内存分配

在说动态内存分配之前先说下 静态内存分配

void main(){ //静态内存分派 int a[1024*1024*10];//申请10m //这样申请会提示堆栈溢出 }

堆内存 栈内存

下面代码 作用 每隔一秒申请40M 内存 看任务管理器 可以看到 别搞死机了,可以把free注释 打开 不过就看不到效果了

//堆内存 void heapFun(){ //40M内存 //字节 //void *任意类型的指针 int 4字节 int* p = malloc(1024 * 1024 * 10 * sizeof(int)); //释放 //free(p); } void main(){ //在堆内存上,分配40M的内存 while (1){ Sleep(1000); stackFun(); } getchar(); }

写个例子01 : 输入一个数 随机生成这个数的长度的数组 并打印

void main(){ //静态内存分配创建数组,数组的大小是固定的 //int i = 10; //int a[i]; int len; printf("输入数组的长度:"); scanf("%d",&len); //开辟内存,大小len*4字节 int* p = malloc(len * sizeof(int)); //p是数组的首地址,p就是数组的名称 //给数组元素赋值(使用这一块刚刚开辟出来的内存区域) int i = 0; for (; i < len - 1; i++){ p[i] = rand() % 100; printf("%d,%#x\n", p[i], &p[i]); } //手动释放内存 free(p); system("pause");//用getchar(); 貌似不行 }

例子: 输入数组长度,生成数组,再次输入新的数组长度,两个数组合并,再重新生成.使用 realloc 函数 重新分配内存

//realloc 重新分配内存 void main(){ int len; printf("第一次输入数组的长度:"); scanf("%d", &len); /*int* p = (int*)malloc(len * sizeof(int)); */ int* p = NULL; p = (int*)calloc(len, sizeof(int));//不知道咋回事我这里又必须强转了 int i = 0; for (; i < len; i++){ p[i] = rand() % 100; printf("%d,%#x\n", p[i], &p[i]); } int addLen; printf("输入数组增加的长度:"); scanf("%d", &addLen); //内存不够用,扩大刚刚分配的内存空间 //1.原来内存的指针 2.内存扩大之后的总大小 int* p2 = (int*)realloc(p, sizeof(int)* (len + addLen)); if (p2 == NULL){ printf("重新分配失败"); } //重新分配内存的两种情况: //缩小,缩小的那一部分数据会丢失 //扩大,(连续的) //1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针 //2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址 //3.如果申请失败,返回NULL,原来的指针仍然有效 //重新赋值 i = 0; printf("--------------------------\n"); for (; i < len + addLen; i++){ p2[i] = rand() % 200; printf("%d,%#x\n", p2[i], &p2[i]); } //手动释放内存 这里如果打开的话将会二次释放了 debug下可以看到 p 和p2 的地址是相同的 /*if (p != NULL){ free(p); p = NULL; }*/ if (p2 != NULL){ free(p2); p2 = NULL; } system("pause"); }

在这里我遇到一个深坑

//手动释放内存 这里如果打开的话将会二次释放了 debug下可以看到 p 和p2 的地址是相同的 /*if (p != NULL){ free(p); p = NULL; }*/ if (p2 != NULL){ free(p2); p2 = NULL; }

一开始我把两个指针都释放了 结果报错 , 原因: 二次释放了 因为p 和p2的地址是相同的,打印一下就知道了.

字符串操作 字符串例子

字符串例子01 初始化

void main(){ //1.字符数组初始化 char ch1[10] = { 'c', 'h', 'i', 'n', 'a','\0' };//\0代表结束 printf("%s\n", ch1); printf("%x#\n", ch1); char str[10] = "china"; printf("%s\n", str); printf("%x#\n", str); //可以被修改 str[0] = 's'; printf("修改后: %s\n", str); system("pause"); }

效果图

字符串例子02 指针初始化 以及操作

//字符指针 void main(){ //从内存连续排列 char *str = "how are you ?"; //不可以被修改 //str[0] = 'w';//把这个打开会报错 printf("%s\n", str); printf("%x#\n", str); //使用指针加法,截取字符串 str += 3; while (*str) { printf("%c", *str); str++; } printf("\n字符串截取完成\n"); getchar(); }


下面是c语音 用于操作字符串的函数 以及网站速查

//strcat字符串拼接函数 //在线API文档: //http://www.kuqin.com/clib/string/strcpy.html /* void main(void){ char dest[50]; char *a = "china"; char *b = " is powerful!"; strcpy(dest, a); strcat(dest, b); printf("%s\n", dest); system("pause"); } */
//strchr在一个串中查找给定字符的第一个匹配之处 /* void main(void){ char *str = "I want go to USA!"; printf("%#x\n", str); //U元素的指针 //str+3 char* p = strchr(str, 'w'); if (p){ printf("索引位置:%d\n", p - str); } else{ printf("没有找到"); } system("pause"); } */
//strstr 从字符串haystack中寻找needle第一次出现的位置 void main(void){ char *haystack = "I want go to USA!"; char *needle = "to"; //U元素的指针 char* p = strstr(haystack, needle); if (p){ printf("索引位置:%d\n", p - haystack); } else{ printf("没有找到"); } system("pause"); }
转载请注明原文地址: https://www.6miu.com/read-94828.html

最新回复(0)