每次使用指针都会遇到大大小小的问题,每次都要翻开资料琢磨错在哪,寻根究底还是对指针还是没有完全掌握。本文为了加深映像,避免以后犯类似的错误,特地做了一些实验。

1.字符串指针变量赋值

#include

int main(){

char *b="azzzxxxddd";

b="azzzxxxdddccccc";

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:这里为什么没有内存溢出呢,原因是初始化b指针的时候将b指向了字符串常量"azzzxxxddd"的首地址,再次赋值"azzzxxxdddccccc"时,又将b指向了字符串常量"azzzxxxddd"的首地址,无论字符串长度怎么增加都不会内存溢出,可见初始化b的时候并没有分配内存,只是做了指向动作。

2.字符串指针变量分配动态内存和赋值

2.1

#include

#include

int main(){

char *b=(char*) malloc(5*sizeof(char));

strcpy(b, "abcdefghids");

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:这里为什么没有内存溢出呢,原因是虽然b指针指向了一段拥有5字符内存空间,但是恰好顺序下来的空间没有填满,所以后面的字符能装下。现在把这个字符串扩充至5000字节赋值再次运行,结果内存溢出报错。

2.2

int main(){

char *a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

char *b=(char*) malloc(5*sizeof(char));

b = a;

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:这里为什么没有内存溢出呢,原因是虽然b指针指向了一段拥有5字符内存空间,但是第二次赋值指针b指向了a指针所指向的地址,原来给b分配的内存空间没有使用。现在把a指向的字符串扩充至5000字节再次运行,依然没有报错,再次证明了这一点,也说明了直接赋值和使用strcpy函数赋值的区别。

2.3

int main(){

char a[20]="aaaaaaaaaaaaaaaaa";

char *b=(char*) malloc(5*sizeof(char));

b = &a;

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:道理同2.2,只是把字符串常量放入了数组,再另b指向数组a的首元素地址。

2.4

int main(){

char a[20]="aaaaaaaaaaaaaaaaa";

char *b=(char*) malloc(5*sizeof(char));

strcpy(b,  a);

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:道理同2.1,把数组a改为5000容量,内放5000字符会内存溢出报错。

总结 :指针变量初始化赋值或直接赋值不会分配内存空间,赋值也只是改变了指针的指向,经过malloc动态分配内存后指针会指向一段连续的未被使用的内存空间,如果此时再使用直接赋值,指针就会指向新赋值的字符串首地址而放弃指向原来的分配空间,如果是用strcpy函数,它会将第二个参数填至指针指向的新内存空间,这是需要注意的。

c语言 system(pause)为什么报错,c语言-指针-分配内存和赋值需要注意的相关推荐

  1. c语言未定义main报错,C语言编译器的错误信息

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Not a valid expression format type 不合法的表达式格式 Not an allowed type 不允许使用的类型 Num ...

  2. c语言输入float就报错,c语言 输入float类型 出错处理

    要对float c进行处理.如果输入的是字符型数据或者其他非浮点数,想实现出错报告的功能(能要求用户重新输入更好).看过perror,exit,strerror之类,不会.以下是部分代码: pol * ...

  3. R语言-处理异常值或报错的三个示例

    R语言-处理异常值或报错的三个示例 参考文章: (1)R语言-处理异常值或报错的三个示例 (2)https://www.cnblogs.com/awishfullyway/p/6611690.html ...

  4. R语言ggplot绘制地图-报错汇总(一)

    R语言ggplot绘制地图-报错汇总 报错两例 报错1: 报错2: 报错两例 在用ggplot绘制地图时出现了两个报错,网上搜索了没有相关说明,虽然解决方式很蠢,但是可能对于出现同样报错的人会有帮助, ...

  5. C语言中几种报错类型的解决方案

    C语言中几种报错类型的解决方案 声明:本人小白,第一次写博客,由于查报错原因比较困难,为了方便记下自己敲代码遇到的问题而随笔写下,文中有诸多错误,希望路过的大佬能够对我的文章批评指正.我也会不断修改完 ...

  6. 虚拟桌面登录报错:为此桌面分配的桌面源当前不可用

    虚拟桌面登录报错:"为此桌面分配的桌面源当前不可用,请稍后在尝试重新连接此桌面,或联系你的系统管理员." 见下图: 解决办法: 1.查看各项设置正常,发现网卡丢失:关闭虚拟机:在v ...

  7. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  8. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

    文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...

  9. c语言整形变浮点型报错,【C语言】第一章

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本专题博客主要内容为本人在C语言学习过程中遇到的主要问题和C语言相关知识点的讲解,是系统性的技术学习博客,使用的环境为V ...

最新文章

  1. Linux课程第十三天学习笔记
  2. 实现oracle-job准确定时
  3. Oracle中的序列 sequence 用法
  4. 互联网产品经理应该具备的技能(需求篇)
  5. [20161006]windows下bbed使用注意.txt
  6. 485通信自动收发电路,历史上最详细的解释
  7. C和指针之字符串简单实现 strcpy、strcat、strstr函数
  8. Silverlight 2 Beta 1版本缺陷列表
  9. RSA客户端js加密服务器C#解密(含源码)
  10. rpm打包的流程包括以下哪些_Linux 下RPM打包制作流程
  11. BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案
  12. 天正cad计算机快捷键,CAD、天正快捷键(专用)
  13. 如何调试微信浏览器内嵌H5
  14. portraiture2022插件安装使用教程
  15. Android自学笔记:Tab控件源码剖析
  16. 小学计算机课后作业,小学信息技术课后作业设计研究
  17. 自己用的unity学习笔记(一)——unity3d基础操作
  18. stc89c52c语言开发,stc89c52烧写程序
  19. pdf大小如何压缩?
  20. Unity 3D官方教程——Tanks!学习记录

热门文章

  1. 新的人工智能系统现在可以成功预测地震
  2. 筋长一寸寿延十年——leo鉴书67
  3. Arm cortex 性能天梯图
  4. MLIR初识 —— Dialect及Operation详解
  5. MySQL ALGORITHM = UNDEFINED/MERGE/TEMPORTARY 详解视图的三种算法与优化方案
  6. spring boot 503_英语原版阅读:Spring
  7. POJ3708 Recurrent Function
  8. Linux服务器挖矿木马清除
  9. 商业社会成功必备16条商规
  10. 【示波器专题】示波器探头的原理深入——有源探头之单端有源探头