C语言sizeof与字符串处理与动态内存分配及main函数参数详解

目录
  • 常用的字符串处理函数(标准库里面的)
  • sizeof 求字节运算符
  • 动态内存分配函数
  • main的参数问题

常用的字符串处理函数(标准库里面的)

strlen : 用来求一个字符串的长度

#include <string.h>
                     size_t strlen(const char *s);
                @s : 指向要计算的那个字符串的首地址 
                    “const char *” : 表示在函数调用过程中,防止对s指向的空间里面内容进行修改。
                    “size_t”: size_t => unsigned int  
                              typede unsigned int size_t  ;

返回值: 返回字符串s第一个\0前面的字符的个数。

atoi:将十进制的数字字符串,转成整数值

                 #include <stdlib.h>
               int atoi(const char *nptr);
               long atol(const char *nptr);
               long long atoll(const char *nptr); 

strcpy/strncpy :字符串拷贝函数 将一个字符串拷贝到另外一个字符串上面去。

#include <string.h>
                strcpy :用来把src指向的字符串,拷贝到dest指向的空间中去,直到遇到\0才会结束。
               char *strcpy(char *dest, const char *src);
                @dest :  destination 目的地 ,必须是一个可写的空间
                @src : source 源,从哪里  
                返回值: 返回拷贝后目的地字符串的首地址

strncpy : 正是为了解决strcpy的这个bug的(strcpy没有考虑到dest指向的空间的大小问题)

#include <string.h>
                     char *strncpy(char *dest, const char *src, size_t n);
                    strncpy: 把src指向的字符串前面顶多n个字符拷贝到dest指向的内存空间中去。
                        它到底拷贝了多少个字符呢? 
                            <= n

(1) 遇到\0拷贝结束,此时\0也会被拷贝。
                            char s[10]; 
                            strncpy(s, "12345", 10);    
                        (2) 已经拷贝了n个字符,此时后面的字符就不会被拷贝。 
                            char s[10]; 
                            strncpy(s, "0123456789", 10);

strcmp / strncmp :一个一个字符进行比较它们对应的ASCII码

if c1 > c2 
                    返回1 
                if c1 < c2 
                    返回-1 
                if c1 == c2 
                    则继续比较下一个字符,如果全部相等则返回0

				   #include <string.h>
				   int strcmp(const char *s1, const char *s2);
				   int strncmp(const char *s1, const char *s2, size_t n);

strcat / strncat 字符串连接函数

#include <string.h>
            strcat : 用来把src指向的字符串拷贝到dest指向的字符串的末尾(尾部连接)
             char *strcat(char *dest, const char *src);
            @dest : 指向目标字符串(一段可写的空间) 
                @src : 指向原始字符串 
                返回值:  
                    返回连接后的字符串的首地址(dest指向的首字符地址)

char *strncat(char *dest, const char *src, size_t n);
            strncat : 把src指向的字符串拷贝到dest末尾,但是它顶多拷贝了n个字符。
                (1) 遇到\0拷贝结束,此时\0也会被拷贝。 
                (2) 即使没有遇到\0,但是已经拷贝了n个字符啦。

sizeof 求字节运算符

sizeof(x) : 用来求一个对象或类型所占字节数的运算符,x可以是一个对象(变量、指针、数组、==),也可以是一个类型。

先求x的类型,然后再求该类型所占的字节数

=> typeof(x)

=> sizeof( typeof(x) )

sizeof(指针类型) == 机器字长

32bits的机器 指针所占字节数为4

64bits的机器 指针所占字节数为8

求数组的大小

		int a[100];
		sieof(a[0]) == 4
		sizeof(a[1024]) ==  4
		sizeof(a) ==
			typeof(a) => int[100]
			sizeof(int[100]) => 4 * 100
		char *  p[4]; //指针数组
		sizeof(p[0]) ==  8
		sizeof(p) ==
			typeof(p) => char* [4]
			sizeof(char *) * 4 == 8 * 4
		char (*p)[4];//数组指针
		sizeof(p)  ==  8
	int (*p)(int ,int); //函数指针
		sizeof(p) ==  8

动态内存分配函数

malloc : 用来动态分配一个size大小的内存空间,并且把分配到内存空间的首地址返回。

malloc分配的空间的生存期,是随进程持续性。

malloc分配的空间一旦分配给你,他就不会自动去释放,一定需要你调用free或你的这个进行消亡了!

#include <stdlib.h>
        void *malloc(size_t size);
                @size : 要分配的空间的大小(以字节为单位)
                返回值:  
                    成功返回分配的空间的首地址
                    失败返回NULL. 
        char * p = (char *)malloc(100);

free : 用来释放ptr指向的内存空间的

ptr指向的内存空间,必须是malloc/realloc/calloc这三个函数分配的内存空间。

void free(void *ptr);
                @ptr : 指向咱们需要释放的那一块内存的首地址
                    一般为malloc/realloc/calloc这三个函数的
                    返回值。

calloc : 它的作用类似于 malloc ,不过它是数组分配函数, 它分配一个数组空间,它带有两个参数。

void *calloc(size_t nmemb, size_t size);
                @nmemb :  表示分配多少元素 
                @size :  表示每一个元素占多少字节
                返回值: 
                    成功返回分配的空间的首地址。
                    失败返回NULL。

int * a = calloc(10, sizeof(int));

realloc : 用来把ptr(必须是malloc/realloc/calloc这三个函数分配的内存空间)指向的动态内存,扩展到size大小。

void *realloc(void *ptr, size_t size);
                @ptr : 指向咱们需要扩展的那一块内存的首地址。
                    一般为malloc/realloc/calloc这三个函数的返回值。
                @size : 扩展到size大小
                返回值: 
                    成功返回分配的空间的首地址
                    失败返回NULL。

1. size > 原来的大小 
                    realloc用来把ptr指向的内存,扩展到size字节,
                    原来前面的内存保持不变,后面新增内存内容不会
                    被初始化。
                    (1) 原址扩建
                    (2) 整体搬迁 
                    2. size ==  0 
                     realloc(ptr, 0) <=> free(ptr)

main的参数问题

在linux下面,程序运行的时候,可以带参数,只不过所有的参数都当作是字符串来处理的。

			//argc :保存你给main传参的个数
			//argv : 用来保存传递给main的所有参数的
			//int main(int argc, char * argv[])
			int main(int argc, char ** argv)
			{
			}

到此这篇关于C语言sizeof与字符串处理与动态内存分配及main函数参数详解的文章就介绍到这了,更多相关C语言sizeof内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言详细讲解常用字符串处理函数

    目录 一.strlen() 1. 函数原型: 2. 手动实现: 二.strcat() 1. 函数原型: 2. 手动实现: 三.strcpy() 1. 函数原型: 2. 手动实现: 四.strcmp() 1. 函数原型: 2. 手动实现: 五.memset() 1. 函数原型: 2. 手动实现: 一.strlen() 1. 函数原型: size_t strlen(const char *str) 参数str: 要计算的字符串的长度返回值: 返回字符串 str 的长度,直到遇到结束字符'\0',但不

  • C语言深入讲解动态内存分配函数的使用

    目录 一.malloc 二.free(用于释放动态开辟的空间) 三.calloc 四.realloc 五.常见的动态内存分配错误 六.柔性数组 局部变量和函数的形参向栈区申请空间 全局变量和static静态变量向静态区申请空间 动态内存分配向堆区申请空间(位于<stdlib.h>或<cstdlib>头文件) 一.malloc void* malloc (size_t size); 分配内存块 分配一个连续可用的字节内存块,返回指向该内存块开头的指针. 新分配的内存块的内容未初始化,

  • C语言深入探究sizeof与整型数据存储及数据类型取值范围

    目录 1.关键字sizeof 2.整型数据存储深入 3.数据类型取值范围深入 1.关键字sizeof sizeof 与 strlen 是我们日常打代码时经常使用到的两个“工具”.前者是求变量或者类型的大小(单位为字节),后者是求某一字符串的长度.我们很容易产生这样一个误解,即把 sizeof 和 strlen 归为函数一类.事实上 sizeof 并不是一个函数,它是一个操作符.关键字.我们通过一段代码证明它不是函数: #include <stdio.h> int main() { int n

  • C语言中static与sizeof查缺补漏篇

    目录 前言 一.关于关键字static 1.static修饰局部变量 2.static修饰全局变量 3.static修饰函数 二.sizeof和strlen的区别 1.sizeof 2.strlen 二者区别 三.关于if()内部>与<的正确使用 前言 最近学习遇到了很多小难题,今天这篇博客就来记录一下最近学习所遇到的一些困惑我的地方,以便于复习. 一.关于关键字static 在C语言中: static是用来修饰变量和函数的 修饰局部变量-称为静态局部变量 修饰全局变量-称为静态全局变量 修饰

  • C语言main函数的三种形式实例详解

    在C语言中,main()函数有三种形式. 1.无参数 #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } 2.有两个参数 习惯上第一个参数是整型argc,保存了外部调用命令的参数个数,第二个参数是指针数组或二级指针argv,以字符串形式保存了与argc对应的参数,如下例子: #include <stdio.h> int main(int argc, char* arg

  • 深入了解C语言中的动态内存分配

    目录 什么是动态内存分配 如何进行动态内存分配 首先我要介绍两个函数 malloc 和 free 第二个开辟空间的动态内存分配的函数 calloc 大小修改函数realloc 今天我们来学习一下C语言中的动态内存分配 开始学习吧 什么是动态内存分配 我们目前已经知道的内存开辟的方式有: int val = 20;//在栈上开辟四个字节. char arr[10] = { 0 };//在栈上开辟十个字节的连续空间 但是上述空间的开辟方式有两个特点: 1.空间开辟的大小是固定的 2.数组在申明的时候

  • 从头学习C语言之字符串处理函数

    目录 字符串处理函数: 存放和使用字符串: 获取字符串长度:strlen 示例: 拷贝字符串:strcpy和strncpy 示例: strncpy: 示例: 连接字符串:strcat和strncat 示例: 比较字符串:strcmp和ctrncmp strncmp和strcmp和区别: 示例: 总结 字符串处理函数: 存放和使用字符串: 字符串常量:“fishc”,“小甲鱼”,“鱼C工作室”字符数组: 获取字符串长度:strlen 用法:strlen(str) 注意: 这个函数获得的是长度(不带

  • c语言中main函数用法及知识点总结

    1.main函数是C程序的入口函数,即程序的执行从main函数开始,其他函数的调动也直接或间接地在main函数中调用. 2.main函数的返回值用于解释程序的退出状态. 若返回0,则表示程序正常退出.返回其他数字的含义由系统决定.通常返回非零代表程序异常退出. 实例 #include <stdio.h> #include <string.h> int main(int argc, char **argv) { int i = 0; printf("The program

  • C语言中main函数与命令行参数详细讲解

    目录 一.main 函数的概念 二.main 函数的本质 命令行 三.main 函数的参数 四.main 函数一定是程序执行的第一个函数吗 五.小结 一.main 函数的概念 C语言中 main 函数称之为主函数 一个C程序是从 main 函数开始执行的 二.main 函数的本质 main 函数是操作系统调用的函数 操作系统总是将 main 函数作为应用程序的开始 操作系统将 main 函数的返回值作为程序的退出状态 下面看一下 main 函数的返回值: A.c: #include <stdio

  • C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    目录 常用的字符串处理函数(标准库里面的) sizeof 求字节运算符 动态内存分配函数 main的参数问题 常用的字符串处理函数(标准库里面的) strlen : 用来求一个字符串的长度 #include <string.h>                     size_t strlen(const char *s);                @s : 指向要计算的那个字符串的首地址                     “const char *” : 表示在函数调用过程中,

  • C语言动态内存管理malloc柔性数组示例详解

    目录 1.1为什么存在动态内存管理 1.2动态内存管理函数 1.2.1malloc 1.2.2free 1.2.3calloc 1.2.4realloc 1.3动态内存管理函数易错点 1.3.1对NULL指针的解引用操作 1.3.2对动态开辟空间的越界访问 1.3.3对非动态开辟内存使用free释放 1.3.4使用free释放一块动态开辟内存的一部分 1.3.5对同一块动态内存多次释放 1.3.6动态开辟内存忘记释放(内存泄漏) 2.1常见相关笔试题 2.2C/C++语言中的内存开辟 2.3柔性

  • C语言 指针变量作为函数参数详解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁. 像数组.字符串.动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合. 有的时候,对于整数.小数.字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值. 有些初学者可能会使用

  • C语言编程动态内存分配常见错误全面分析

    目录 前言:为什么存在动态内存分配? 一.动态内存函数 1.malloc和free函数 2.calloc函数 3.realloc函数 二.常见错误 1.对NULL指针解引用 2.对动态开辟空间的越界访问 3.对非动态开辟使用free函数 4.使用free释放一块动态内存开辟内存的一部分 5.对同一块空间多次释放 6.动态开辟内存忘记释放 总结 前言:为什么存在动态内存分配? 我们已经掌握的内存开辟方式如下 int a=10;//在栈空间上开辟4字节 char arr[10]={0};//在栈空间

  • Android NDK开发(C语言--动态内存分配)

    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数.这些函数可以在 <stdlib.h> 头文件中找到. 序号 函数和描述 1 void calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0.所以它的结果是分配了 numsize 个字节长度的内存空间,并且每个字节的值都是0. 2 void free(void *address); 该函数释放 address 所指向的内存块,释放的是动态分配的

  • C语言动态内存分配的详解

    C语言动态内存分配的详解 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题. 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放. (1)void *malloc(size_t size); malloc的参数就是需要分配的内存字节数.malloc分配一块连续的内存.如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针. (2)void free(void *poi

  • C语言 动态内存分配的详解及实例

    1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* mallo

  • C语言 动态内存分配详解

    C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构.堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表. \在C语言中,全局变量分配在内存中的静态存储区,非静态的局部变量(包括形参)是分配在内存的动态存储区,该存储区被

  • c语言动态内存分配知识点及实例

    c语言怎么实现动态内存分配 我们经常会预先给程序开辟好内存空间,然后进行操作. int arr[5] ; 对这个数组我们在定义的时候必须给提前开辟好空间,并且在程序执行的过程中,这个开辟的内存空间是一直存在的,除非等到这个函数执行完毕,才会将空间释放.有个问题就是这个数组在程序中无法被修改. 这些问题给我们造成了一些使用上的不方便,所以,C中提供了malloc()函数. 关于malloc()函数,这个函数它接受一个参数:就是所需的内存的字节数.然后malloc()找到可用内存中那一个大小适合的块

  • C语言动态内存分配函数的实现

    在C中我们开辟内存空间有两种方式 : 1.静态开辟内存 :例如: int a;int b[10]; 这种开辟内存空间的特点是 所开辟的内存是在栈中开辟的固定大小的 ,如a是4字节 ,数组b是40字节 ,并且数组在申明时必须指定其长度 , 如果是全局数组的话,内存是在编译时分配好的,如果是局部变量数组的话,运行时在栈上静态分配内存.不管是全局数组还是局部数组,它们都有一个特点,那就是数组大小是确定的,是代码中写死的.那如果我们想在程序运行时才确定一个数组的大小 , 前两种在栈上分配内存的方法显然是

随机推荐