c语言 system(pause)为什么报错,c语言-指针-分配内存和赋值需要注意的
每次使用指针都会遇到大大小小的问题,每次都要翻开资料琢磨错在哪,寻根究底还是对指针还是没有完全掌握。本文为了加深映像,避免以后犯类似的错误,特地做了一些实验。
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语言-指针-分配内存和赋值需要注意的相关推荐
- c语言未定义main报错,C语言编译器的错误信息
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Not a valid expression format type 不合法的表达式格式 Not an allowed type 不允许使用的类型 Num ...
- c语言输入float就报错,c语言 输入float类型 出错处理
要对float c进行处理.如果输入的是字符型数据或者其他非浮点数,想实现出错报告的功能(能要求用户重新输入更好).看过perror,exit,strerror之类,不会.以下是部分代码: pol * ...
- R语言-处理异常值或报错的三个示例
R语言-处理异常值或报错的三个示例 参考文章: (1)R语言-处理异常值或报错的三个示例 (2)https://www.cnblogs.com/awishfullyway/p/6611690.html ...
- R语言ggplot绘制地图-报错汇总(一)
R语言ggplot绘制地图-报错汇总 报错两例 报错1: 报错2: 报错两例 在用ggplot绘制地图时出现了两个报错,网上搜索了没有相关说明,虽然解决方式很蠢,但是可能对于出现同样报错的人会有帮助, ...
- C语言中几种报错类型的解决方案
C语言中几种报错类型的解决方案 声明:本人小白,第一次写博客,由于查报错原因比较困难,为了方便记下自己敲代码遇到的问题而随笔写下,文中有诸多错误,希望路过的大佬能够对我的文章批评指正.我也会不断修改完 ...
- 虚拟桌面登录报错:为此桌面分配的桌面源当前不可用
虚拟桌面登录报错:"为此桌面分配的桌面源当前不可用,请稍后在尝试重新连接此桌面,或联系你的系统管理员." 见下图: 解决办法: 1.查看各项设置正常,发现网卡丢失:关闭虚拟机:在v ...
- 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )
文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...
- c语言整形变浮点型报错,【C语言】第一章
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本专题博客主要内容为本人在C语言学习过程中遇到的主要问题和C语言相关知识点的讲解,是系统性的技术学习博客,使用的环境为V ...
最新文章
- Linux课程第十三天学习笔记
- 实现oracle-job准确定时
- Oracle中的序列 sequence 用法
- 互联网产品经理应该具备的技能(需求篇)
- [20161006]windows下bbed使用注意.txt
- 485通信自动收发电路,历史上最详细的解释
- C和指针之字符串简单实现 strcpy、strcat、strstr函数
- Silverlight 2 Beta 1版本缺陷列表
- RSA客户端js加密服务器C#解密(含源码)
- rpm打包的流程包括以下哪些_Linux 下RPM打包制作流程
- BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案
- 天正cad计算机快捷键,CAD、天正快捷键(专用)
- 如何调试微信浏览器内嵌H5
- portraiture2022插件安装使用教程
- Android自学笔记:Tab控件源码剖析
- 小学计算机课后作业,小学信息技术课后作业设计研究
- 自己用的unity学习笔记(一)——unity3d基础操作
- stc89c52c语言开发,stc89c52烧写程序
- pdf大小如何压缩?
- Unity 3D官方教程——Tanks!学习记录