首页
学习
活动
专区
圈层
工具
发布

【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )

文章目录 一、字符串 一级指针 内存模型 1、指定大小字符数组 2、未指定大小字符数组 3、指向常量字符串的指针 4、指向堆内存的指针 一、字符串 一级指针 内存模型 ---- #include 数组 , 数组大小 5 字节 , 为其赋值时 , 使用了 “abc” 字符串常量 ; 在 全局区 的 常量区 存放 “abc” 字符串常量 ; 使用 “abc” 常量为 数组 赋值 , 注意数组的最后一位是...字节 ; // 栈内存数组 不指定大小 char array2[] = "123"; 3、指向常量字符串的指针 在 栈内存 中 , 定义 局部变量 指针 p , 没有为该指针分配内存..., 该指针指向 字符串常量 “def” ; 在 全局区 的 常量区 中 , 定义 字符串常量 “def” ; // 定义指针 , 使用字符串赋值 char *p = "def"; 4...、指向堆内存的指针 先在 堆内存 中 , 分配 5 字节内存 ; 然后 在 全局区 的常量区 中 , 定义 字符串常量 “456” ; 最后 将 字符串常量 “456” 拷贝到 堆内存 分配的 内存中

2.6K20

C和C++安全编码复习

字符串由一个以空字符(null)作为结束的连续字符序列组成,并包含此空字符(sizeof=strlen+1) 一个指向字符串的指针实际指向该字符串的起始字符。 数组大小。...拷贝字符串时,源字符串长度可能大于目标数组空间。.../内存操作函数的源指针和目标指针指向内存重叠区 说明:内存重叠区是指一段确定大小及地址的内存区,该内存区被多个地址指针指向或引用,这些指针介于首地址和尾地址之间。...,但复制后目标字符串内容会被更改,该函数将返回指向目标字符串的指针。...即使是对空指针的解引用,也可能导致任意代码执行漏洞。如果黑客事先对内存0地址内容进行恶意的构造,解引用后会指向黑客指定的地址,执行任意代码。

2.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    越界访问:意外的死循环

    ,它可能指向一个随机的内存地址,解引用这样的指针会导致越界访问。...野指针:指针指向了一个已经被释放或从未分配的内存区域。 指针偏移错误:通过指针进行偏移操作时,如果偏移量计算错误,可能会导致指针指向无效的内存地址。...int arr[10]; int* ptr = arr; ptr += 11; // 错误:ptr指向了数组范围之外 *ptr = 42; // 越界访问 字符串操作 字符串长度错误:在处理字符串时,如果字符串长度计算错误...int arr[10]; for (int i = 0; i < 10; i++) { arr[i] = i; } 使用安全的数组操作函数:在C语言中,可以使用如strncpy、strncat等安全的字符串操作函数...:在解引用指针之前,检查指针是否指向有效的内存地址。

    82810

    【C语言基础】:字符串函数(二)

    这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行后面的对,直到字符不相同,直到达到终止的空字符,或者直到两个字符串中的num字符匹配,以先发生的为准。...第一次出现的指针,如果str2不是str1的一部分,则返回空指针。...原函数的返回类型是arr2在arr1中第一次出现的指针,所以返回类型就是 char*。...\0时,就说明已经匹配到了,但需要有一个指针记录从哪里开始匹配的。...而str1却是b,这时候又要回去重新进行匹配,但str2中的指针已经指向c了,没办法回去,所以这里不仅需要一个指针记录开始匹配的位置,还需要一个指针指向str2的开始位置,方便那个指针能指向回来。

    16310

    【C】字符串函数——大全(简洁,精炼,初学者)

    一.C语言对字符和字符串的处理 C语言中对字符和字符串的处理很是频繁,但是C语言本身并没有字符串类型,字符串通常放在常量字符串或者字符数组中。...(虽然能成功拷贝,但仍然会报错)(要保证目标空间足够大·) 2.场景:拷贝放到常量字符串 前提条件:(目标指针指向的空间必须可修改) 3.模拟实现strcpy 原理:逐个改变目的地的地址...长度不受限制的字符串函数 PS:strncpy,strncat不仅是长度受限与否的区别,还有特性上的区别 七.strncpy 应用场景: 一:情景:strncpy遇到过分拷贝时的运作...十.strstr(在一个字符串中查找另一个字符串是否存在) 返回值的情况: 存在:返回子串第一次出现的位置 不存在: 返回NULL 使用场景: 1.模拟实现strstr 原理:分别设置两个比对指针...) 错误码:0,1,2,3,4(C语言中库函数报错时的错误码) 功能:接收错误码并把错误码转换成错误信息 PS:errno是c语言提供的全局的错误变量,当调用时,错误码就会存进去

    34910

    【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

    形参中的 指针变量 , 具体操作的是 函数中 定义的 局部指针变量 ; 直接使用 *to_tmp++ 样式的代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ; 如果 将...数组首地址 的 常量指针 的 指针指向 进行修改 , 直接就报错了 ; 函数形参 的 值 , 不要轻易进行改变 , 因此一般函数的形参 , 都定义为 const char * 指针常量 类型 ; 引入...辅助 局部变量 , 接收 函数 形参变量 ; 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 ; 代码示例 : /* * 实现字符串拷贝 ( 实现了模块化 ) * 将 from...指针指向的字符串 拷贝到 to 指针指向的字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 形参 char *from_tmp...( 实现了模块化 ) * 将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换 */ void str_copy(char *from, char *to) { //

    1.3K10

    你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

    这里,sizeof(nums)只是计算了指针的字节数(这里指针指向了数组的首元素的地址,一个int占4个字节,所以最后length变成了1)。   ...那么,为了避免出现无法计算长度的情况,我们一般都会在方法定义时增加一个长度的参数,让调用者传递过来,函数内部不再计算长度。...2.1 使用strcpy复制字符串   一个简单的场景,将一个字符串复制到另一个字符串中,在C语言课本中,最长出现的就是strcpy了。...因为strcpy在执行字符串拷贝的时候,会从strSrc所指位置开始,检测当前内存单元中存储的数据是否为'\0'。如果不为'\0',则将这个内存单元中的数据拷贝到strDest所指向的内存中。...中的count个字符拷贝到字符串dest中去,最后返回指向dest的指针。

    1.6K20

    【C语言】字符串函数「超详细」

    dest→ 指向用于存储复制内容的目标数组。 src→ 要复制的字符串。 该函数返回一个指向最终的目标字符串 dest 的指针。...dest → 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。 src → 指向要追加的字符串,该字符串不会覆盖目标字符串。...dest→指向目标数组,该数组包含了一个 C语言 字符串,且足够容纳追加后的字符串,包括额外的空字符。 src→要追加的字符串。 n→追加的最大字符串。...返回值:如果找到令牌,则指向令牌开头的指针。否则,为空指针。当被扫描的字符串到达字符串的末尾(即一个空字符)时,总是返回一个空指针。...由strerror产生的错误字符串可能特定于每个系统和库实现。 返回值:该函数返回一个指向错误字符串的指针,该错误字符串描述了错误 errnum。

    1.6K20

    C语言进阶——字符串&&内存函数

    既然是模仿库函数,那么在返回类型、参数类型等方面要和库函数一致,在统计长度前,我们可以使用一个临时指针记录起始位置,当我们的源指针指向结束标志时,循环结束,将两个指针相减,就能得到元素个数(关于指针 -...,就需要把指向首地址处的指针 dest 移向尾地址,当然在移动前要保存此地址,将此时的尾地址看作首地址2,将源字符串中的元素从此处开始拷贝至目标字符数组中,这样就完成了追加的操作,最后再返回之前记录的首地址就行了...strstr 寻找   字符串寻找函数,作用是在目标字符串中寻找是否出现过源字符串,如果出现则返回第一次其在目标字符串中第一次出现的地址,如果没有出现,则返回一个空指针。...;错误码:是指包含各种错误信息的数字代码,比如数字0表示没有错误,经过博主测试,C语言中有大约141个错误码。...如果直接将错误码放入 strerror 中并打印,会出现相应的错误信息;当然,C语言中有一个专门的函数记录错误码,即 errno,需要引出头文件 errno.h,当程序运行出错后,errno 会获取当前的错误码

    59210

    C++ <cstring>字符串库函数的自定义实现

    同时strcpy和strncpy在源和目的重叠时也会有问题的。memcpy函数从字节数组s2向s1复制n个字节。如果源和目的有重叠,那么使用memcpy会有问题。...根据比较结束时第一个字符(字节)数组中的字符(字节)是小于、等于或大于第二个字符(字节)数组中的字符(字节)而返回-1,0或1。...s中搜索字符c,它会返回一个指向s中第一个字符c的指针,如果没找到,则返回空指针。...当遇到空字符时停止搜索。 memchr函数在搜索了n个字符后停止搜索,返回第一个字符c的指针,若未找到,则返回空指针。 strrchr与strchr类似,只是从字符串s的空字符开始,反向搜索字符c。...strlen返回字符串的长度,不包括字符串末尾的空字符。strerror当输入存储在errno的错误码时,会返回一个指向描述这种错误的字符串的指针。

    1.6K40

    【C 语言】二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 )

    文章目录 一、二级指针案例 ( 返回二维数组 ) 二、完整代码示例 一、二级指针案例 ( 返回二维数组 ) ---- 将 “12,ab,345,” 字符串 以 逗号 “,” 分割 , 放到二维数组中 ,...: char array[3][4]; 核心逻辑 : ① 查找字符 : 令 2 个指针都指向 “12,ab,345,” 字符串 , 查找逗号字符 , 将其中一个指针指向第一次出现的 逗号 字符位置..., 然后将 2 个指针之间的字符拷贝出来 ; ② 重置变量 : 重新设置 2 个指针的位置 , 指向上一次逗号字符的后面第一个字符 , 然后又开始重新查找逗号字符 , 继续执行 ① 中的操作...; do { // 字符串中, 查找 字符 ',' // 找到后 , 返回 逗号 第一次出现的指针 p1 = strchr(p1, c);..., 查找 字符 ',' // 找到后 , 返回 逗号 第一次出现的指针 p1 = strchr(p1, c); if (p1 !

    2K10

    【C语言】字符串操作函数详解

    ,src: 源字符串指针 指向目标字符串 dest 的指针 strncpy 复制指定长度的字符串 dest: 目标字符数组指针,src: 源字符串指针,n: 最大字符数 指向目标字符串 dest 的指针...str1: 第一个字符串指针,str2: 第二个字符串指针,n: 比较长度 比较结果:负值、零或正值 strchr 查找第一次出现的字符 str: 要搜索的字符串指针,c: 要查找的字符 指向第一次出现字符...c 的指针 strrchr 查找最后一次出现的字符 str: 要搜索的字符串指针,c: 要查找的字符 指向最后一次出现字符 c 的指针 strstr 查找子字符串 haystack: 要搜索的字符串指针...3. strncpy 函数原型: char *strncpy(char *dest, const char *src, size_t n); 参数说明: dest: 指向目标字符数组的指针。...c: 要查找的字符(以 int 类型传递,但实际上是 char)。 返回值说明: 返回指向第一次出现的字符 c 的指针; 如果字符不在字符串中,则返回 NULL。

    28710

    C语言字符串详解

    字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。...1.4、 字符串常量与字符数组的区别 1)字符串常量是一个字符数组,但是内容和长度在初始化时就已经固定了,不可更改;可以通过一个指向字符串常量第一个元素的指针来访问该字符串常量; 2)字符数组是一个用于存放字符的数组...使用 strcpy 函数时需要注意的是,必须保证目标字符数组 dst 的长度足够存放源字符数组 src 的内容。...函数 strrchr 在字符串中查找字符 ch 最后一次出现的位置,并返回指向该位置的指针。...中查找整个字符串 str2 第一次出现的起始位置,并返回一个指向该位置的指针;如果 str2 并没有完整的出现在 str1 中,则函数将返回一个 NULL 指针;如果 str2 是一个空字符串,则返回

    4.2K88

    C语言常见字符函数和字符串函数精讲

    gets函数原型: char *gets(char *str); 参数: str:指向一个字符数组的指针,gets 函数会将读取的字符串存储在这个数组中。...needle: 指向要查找的子字符串的指针。 功能: strstr 函数在字符串 haystack 中查找子字符串 needle 的第一次出现。搜索是不区分大小写的。...在第一次调用 strtok 时,它会在找到的第一个分隔符处将字符串 str 替换为一个空字符('\0'),并返回指向标记的指针。...后续调用 strtok 时,应该将第一个参数设置为 NULL,这样函数就会继续处理同一个字符串,从上一次找到的标记结束的地方开始。 返回值: 成功时,strtok 返回指向下一个标记的指针。...功能: 返回一个指向描述错误的字符串的指针。这个字符串对应于 errnum 代表的错误信息。 返回值: 返回一个指向静态缓冲区中描述错误的字符串的指针。

    22510

    C语言常用的字符串函数及案例

    它的作用是在一个字符串中查找给定字符的首次出现位置。 语法:char *strchr(const char *str, int c); 参数: str:指向要查找的字符串的指针。 c:要查找的字符。...str2:指向要搜索的字符的字符串的指针。 返回值: 返回指向str1中第一个在str2中出现的字符的指针,如果在str1中没有出现str2中的任何字符,则返回NULL。...由于 C 语言中数组的第一个元素的位置编号是 0, 所以最终的输出加上 1, 即为字符的位置编号.其中p是一个字符指针,指向包含元音字母的位置;str是一个字符数组,代表要搜索的字符串。...返回值: 返回指向str中最后一次出现的c的指针,如果c没有出现在str中,则返回NULL。...needle:指向要查找的字符串的指针。 返回值: 返回指向haystack中第一次出现的needle的指针,如果needle没有出现在haystack中,则返回NULL。

    1.1K10

    C语言string.h所有函数汇总

    参数Parametersdestination指向目标数组的指针,该数组应包含 C 字符串,并且足够大以包含串联的结果字符串。source要追加的 C 字符串。这不应与目标重叠。...参数Parametersdestination指向目标数组的指针,该数组应包含一个 C 字符串,并且足够大以包含串联的结果字符串,包括其他 null 字符。source要追加的 C 字符串。...在 ptr 数组上检查的值和每个字节都被解释为无符号字符进行比较。参数Parametersptr指向执行搜索的内存块的指针。value要定位的值。...返回值Return Value如果找到令牌,则指向令牌开头的指针。否则为空指针。当在正在扫描的字符串中到达字符串的末尾(即空字符)时,始终返回空指针。...Error number.返回值Return Value指向描述错误 errnum 的错误字符串的指针。

    85700

    【C语言】字符串函数+内存操作函数

    , including the terminating null character (and stopping at that point) 将源头指向的C字符串赋值到目的指针指向的数组中,包括终止空字符...(并且在该位置停止) 1.返回类型是目的地字符串的地址char*,参数分别是不可改变的指向源头字符串的指针和可以改变的指向目的地字符串的指针 2.源头字符串必须要以\0结束,拷贝时会将\0也拷贝过去...} 而当我们使用strncpy函数时,这时我们的终端是无法输出正确的结果的,他会出现乱码,与strcpy函数相比,是比较安全的。...图片分割线 通过上面的这两张图片我们可以看出,当内容溢出时,我们的strncpy函数是不会给你添加\0的,所以当printf函数打印时,无法找到\0就会打印出来乱码,出现了越界访问的程序错误 9....这里会先执行自增或自减运算符,可是,如果你没有先进行强转指针类型,就去对void*指针进行自增运算,这是不符合语法规定的,程序会出现错误 12.内存函数memmove的模拟实现 12.1C语言标准规定

    1K20

    【C语言加油站】详细解读字符函数与字符串函数

    strlen函数我们在之前有过简单的介绍它的使用,今天我们来详细介绍一下; 3.2.2 strlen的使用 strlen的使用比较简单,它的参数是一个字符指针,既然是指针,我们对其传参时可以是字符数组的数组名...、也可以是字符串,还可以是存储常量字符串的字符指针,它会计算字符串中字符的数量,但是不包括'\0',如下所示 下面我们来使用一下strlen计算字符串、字符指针和字符数组: 有一点我们一定要注意: 参数指向的字符串必须以...,如下所示: 可以看到当我们将ch1的类型由字符数组类型改为字符指针类型后,此时的ch1就变成了一个内容不可修改的常量字符串,这时我们再来调用strtok函数时,因为函数会对ch1中的内容进行修改,所以就出现了写入冲突的错误...,会将标记末尾的分隔符修改为'\0'并返回一个指向该标记的指针; 如果字符串strToken中不存在分隔符,则会返回指向字符串strToken的指针; 如果字符串strToken中不存在标记,则会返回NULL...的参数为空指针时,只打印错误信息; perror的参数为非空指针时,会先打印字符串中的内容,并在后面加上冒号和空格后再打印错误信息; perror应该在错误产生时立即调用,否则会被其它的信息给覆盖; 3.8.4

    30210
    领券