c语言源码解释,C语言一些细节注意(源码+解释)

2023-11-17

最近可能要回归底层开发设计,所以又看了看C的一些东西。顺便对一些问题进行了代码确认。现将代码贴出,希望对各位网友有所帮助。

/******************************************************************************

*                                                                            **

*只是为了测试,没有按照什么规范写。代码风格比较烂。哈哈哈哈,大家见谅了。^O^ **

*                                                                            **

*******************************************************************************/

#include #include #include

#define SQR(x)      ((x) * (x))     //注意此处一定要把x括起来,避免传入的值有括号或者计算

#define TSqr(x)     printf("The square of "#x" is %d\n",((x) * (x)))

#define __V         1.0.0

static int j;

/*

fun1 fun2是测试static修饰符的作用的。

*/

int fun1()

{

static int i = 0;

i++;

printf("i=%d ",i);

}

int fun2()

{

j = 0;

j++;

printf("j=%d ",j);

}

/*

fun3测试数组的传递。数组传递的是一个地址而不是数组的值。

而且传递的是实参的一个拷贝,而不是实参本身

*/

int fun3(char a[],int b[])

{

printf("\nInput parameter(a) size is %d",sizeof(a));        //所以此处的值在32位机器上是4

printf("\nInput parameter(b) size is %d",sizeof(b));        //所以此处的值在32位机器上是4

printf("\nInput parameter(a[2]) value is %c",a[2]);

printf("\nInput parameter(b[2]) value is %d",b[2]);         //数组的第3个元素的值

return;

}

/*

fun4 测试负数整除及取余的操作。

测试C语言的几个全局宏定义,这三个宏定义对于写日志文件(log)很有用处

*/

int fun4()

{

printf("A==%d B==%d",(-3)/2,(-3)%2);         //这个地方都是-1

printf("\nFile:%s ",__FILE__);

printf("\nLine:%d ",__LINE__);

printf("\nDate:%s ",(char*)__DATE__);

}

/*

*   fun5测试数组的相关注意事项,及数组参数传递

*/

int fun5()

{

int a[3][2] = {(0,1),(2,3),(4,5)};

int b[3][2] = {{0,1},{2,3},{4,5}};

int c[5] = {0,1,2,3,4};

char d[5] = "abcde";

int *p;

int *t;

p=a[0];

t=b[0];

printf("\nFalse:%d\n True:%d",p[0],t[0]);        //p[0]为1,因为初始化数组是用的是小括号。t[0]是0因为用的是花括号。

printf("\n");

fun3(d,c);                                       //传递地址,数组c的一个拷贝

}

/*

* 测试结构体内部指针内存分配

*/

int fun6()

{

struct sctTest

{

char *name;

int nSex;

};

//定义一个结构体指针

struct sctTest *pTst;

struct sctTest Tst;

//将结构体变量值初始化为0,不过我通过单步调试发现不初始化,结构体内部变量的值也是0,

//但是好的书写规范建议对变量还是进行初始化的好。因为局部变量的值不初始化其值是不定的。

memset(&pTst,0,sizeof(struct sctTest));

memset(&Tst,0,sizeof(struct sctTest));

//初始化结构体指针,分配内存.如果不要这句程序会报错。内存溢出。因为pTst是指针,指针没有合法

//的内存地址指向,导致野指针存在

pTst = (struct sctTest*)malloc(sizeof(struct sctTest));

//初始化结构体中指针name。如果不要这句程序会报错。内存溢出。因为name指针没有合法

//的内存地址指向

if(NULL == pTst)

{

return;

}

pTst->name = (char*)malloc(sizeof(char *));

Tst.name = (char *)malloc(sizeof(char *));

if(NULL == pTst->name || NULL == Tst.name)

{

return;

}

strcpy(pTst->name,"BeiJing");

strcpy(Tst.name,"chiping");

printf("The name of pTst is %s\n",pTst->name);

printf("The name of Tst is %s\n",Tst.name);

//释放,避免野指针出现,避免内存泄露

free(pTst);

free(pTst->name);

free(Tst.name);

pTst=NULL;

return 0;

}

/*

* fun7 测试为什么要在释放内存后将指针指向NULL(哈哈哈,栓野狗的桩子^_^)

*/

int fun7()

{

printf("\nFun7 start\n");

char *pChr = (char *)malloc(sizeof(char *));

if(NULL == pChr)

{

return -1;

}

strcpy(pChr,"abcdefg");

printf("\nString is %s\n &%x",pChr,&pChr);

free(pChr);

//如果不讲pChr指针指向NULL,pChr依然保存上次申请地址时的地址信息。free只是将pChr指针不再指向

//申请的内存地址,不再拥有该内存地址的使用权,但是内容却没有改变,所以要指向NULL

//pChr=NULL;

//char *tt = (char *)malloc(10);

//printf("\ntt address is %x\n",&tt);

/*如果不指向NULL,那么下边这段代码是要出问题的。因为pChr此时不是NULL,但是他没有

*可用的内存了,可用内存被free掉了。所以strcpy时会内存溢出(^_^出问题了,我在gcc环境下

*free掉后下边的代码照常执行,高手看看啥原因呀?这个地方如果是复杂程序有可能会失败。此处的pChr

*已经是野指针了,因为free已经告诉操作系统这块地址pChr不用了,你可以用作其他用途,但是你还用

*那么就是在操作野指针,有时可能不会出错,但是程序不知道什么时候就出错了。这种错误是相当危险了,出现问题后

*你会很难定位问题出现的原因。比如,在调用fun7的时候你循环调用10000次,你就会发现你的程序会在某次

*循环后出错。)

*/

if(NULL != pChr)

{

strcpy(pChr,"aaaaaaaaaaaaaa");

printf("\nString2 is %s\n &%x",pChr,&pChr);

}

return 0;

}

int main()

{

int k = 0;

//以下for循环测试static修饰符

for(k = 0; k < 10; k++)

{

fun1();

fun2();

}

printf("\n");

//测试不同情况下sizeof,切忌sizeof是保留字而不是函数。

printf("sizeof->(int):%d (k):%d k:%d",sizeof(int),sizeof(k),sizeof k);

int *p;

//测试指针变量的大小,指针变量的大小是指针存储数据类型的大小

printf("\nint(p) size is %d",sizeof(p));

char *chrP=NULL;

printf("\nchar(p) size is %d",sizeof(chrP));

chrP = (char *)malloc(10*sizeof(char *));

//对指针一定要做判空操作,因为内存申请有可能申请失败

if(NULL != chrP)

{

strcpy(chrP,"abc");

}

printf("\nchar(Assignment p) size is %d",sizeof(chrP));

printf("\nchar(Assignment p) length is %d",strlen(chrP));

void *vP=NULL;

printf("\nvoid(p) size is %d",sizeof(vP));

free(chrP);

free(vP);

chrP = NULL;

vP = NULL;

//通过以上测试确定指针类型的sizeof的值为4。strlen则是指针

//实际指向的地址空间存储的数据的长度(不包括结束符)

//#ifdef __V

#pragma message("__V is defined");

//#endif

int a[4];

memset(a,0,sizeof(a));

/*测试数组的首地址及首元素的首地址

*a是整个数组的首元素的首地址,&a是整个数组的首地址

*注意&a+1,这里的1是4*sizeof(int)

*对指针进行加1 操作,得到的是下一个元素的地址,而不是原有地址值直接加1。所以,

*一个类型为T的指针的移动,以sizeof(T)  为移动单位。

*/

printf("\n&a size=%d &a[0] size=%d ",sizeof(&a),sizeof(&a[0]));

printf("\n&a=%d &a[0]%d a=%d &a+1=%d",&a,&a[0],a,&a+1);

//int iRef = fun3(a);

//测试有符号与无符号数据的计算

int i = -20;

unsigned int j = 10;

printf("\nint + unsigned = %d ",i+j);

//测试标识符(//)

char *chrContext="aaaaaaa   //bbbbbbbbbbb";

printf("\n// in string :%s",chrContext);

printf("\n");

//测试标识符(#)

TSqr(10);

//测试标识符(##)没有搞定,待高手解决

//XNAME(8);

fun4();

printf("\n");

//测试宏定义注意事项

printf("SQR: %d\n",SQR(10));

fun5();

printf("\n");

fun6();

int tt=0;

//for(tt=0;tt<10000;tt++)

//{

//    printf("\ncount=%d\n",tt);

fun7();

//}

return 0;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言源码解释,C语言一些细节注意(源码+解释) 的相关文章

  • 干货!面向低精度量化的神经网络训练算法

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 对神经网络进行低精度量化 尤其是混合精度量化 是提升神经网络部署效率的重要方法之一 然而 如何让神经网络适应低精度的表示 如何选取最合适的量化精度 依然存在很多没有解决的问题 本
  • BERT和GPT模型简介

    1 引言 从现在的大趋势来看 使用某种模型预训练一个语言模型看起来是一种比较靠谱的方法 从之前 AI2 的 ELMo 到 OpenAI 的 fine tune transformer 再到 Google 的 BERT GPT 全都是对预训练
  • QT 颜色选择器 QColorDialog 使用

    需求 点击修改按钮 弹出 颜色选择框 确定后 给 label 设置背景色 打印 代码 include
  • 通信原理(一) 通信原理概述

    文章目录 0 通信系统 1 通信方式 单工 双工与半双工 并行传输与串行传输 2 性能指标 2 1 有效性指标 2 2 可靠性指标 3 码 3 1 码字 码元 码长 3 2 码的分类 4 抽样与抽样定理 4 1 理想抽样和实际抽样 4 2
  • 深入理解const char*p,char const*p,char *const p,const char **p,char *const*p ...

    一 可能的组合 1 const char p 2 char const p 3 char const p 4 const char p 5 char const p 6 char const p 7 char const p 当然还有在 5
  • /etc/init.d/mysql: No such file or directory 和 ERROR 2002 (HY000): Can't connect to local MySQL server through socket 解决办法

    更改 etc my cnf client password your password port 3306 socket tmp mysql sock Here follows entries for some specific progr
  • 如何替换eclipse的logo?

    是不是对Eclipse的Logo已经审美疲劳了呢 如果换成了自己喜爱的照片 相信心情一定会高兴很多 下面就教给你如何替换它 我所知道就有两种方法 介绍两种方法之前 有一个基础的问题 那就是做为Logo你的图片需要那些条件呢 其实条件很简单
  • 直流电机笔记1-串并励电机特性

    文章目录 一切的基础 电磁感应定律 磁感线 左手定则 右手定则 安培定则 也叫右手螺旋定则 直流电机转动机理直观演示 直流串励 并励电机构造与区别 直流电机的反电动势 一切的基础 电磁感应定律 1 1831法拉第发现第一块磁铁穿过一个闭合线
  • 一文读懂机器学习,大数据/自然语言处理/算法全有了……

    作者注 本文生动形象 深入浅出的方式介绍了机器学习及其它算法 适合新人和想更加了解机器学习的读者阅读 此文属于转载 下面链接是原文出处 我们尊重原作者的版权保护 https www cnblogs com donaldlee2008 p 5
  • C++字符串格式化

    c c 的字符串格式化问题 常常会困扰人 只要做个集中整理 以便今后查看 格式化值 返回百分号 b 返回二进制数 c 返回与ASCII值相对应的字符 d 带有正负号的十进制数 e 科学计数符号 如 1 2e 2 u 不带正负号的十进制数 u
  • js实现打印功能

    window print 执行打印功能 打印后执行的操作window onafterprint 打印前执行的操作window onbeforeprint div class x body div class noprint div type
  • js原型,原型链,call/apply

    目录 1 prototype原型 2 proto 2 1常见错误 3 原型链 3 1 Object prototype是大部分对象的最终原型 3 2 Object create 4 call apply 1 prototype原型 定义 原
  • 新手如何学习网络安全?

    每天都有新闻报道描述着新技术对人们的生活和工作方式带来的巨大乃至压倒性影响 与此同时有关网络攻击和数据泄露的头条新闻也是日益频繁 攻击者可谓无处不在 企业外部充斥着黑客 有组织的犯罪团体以及民族国家网络间谍 他们的能力和蛮横程度正日渐增长
  • topk问题求解

    1 利用快排思路求解 static int partation vector
  • 如何使用ChatGPT制作免费的数字人

    传统的数字人制作过程 制作属于自己的免费的数字人是一个复杂的过程 需要涉及多个方面的知识和技术 以下是一个大致的步骤指南 以帮助你开始这个过程 1 确定数字人的目标和设计 首先 你需要确定数字人的用途和目标 是用于虚拟助手 游戏角色还是其他
  • SpringBoot将文件上传到项目的根路径中,相对路径

    1 依赖
  • DLL调试方法 VS2012 C++ 有代码时

    把exe放到输出目录 并把调试 命令 设为 S o l u t i o n
  • vue 如何在一个页面上调用另一个页面的方法

    vue 如何在一个页面上调用另一个页面的方法 首先同一个vue实例来调用两个方法 所以可以建立一个中转站 建立 util js 中转站文件 任意位置 我是在 assets js util js import Vue from vue exp
  • MySQL基础知识每日总结(5)

    regexp检查总是返回0 没有匹配 或者1 匹配 一 CASE表达式 1 两种写法 简单case表达式 case sex when 1 then 男 when 2 then 女 else 其他 end 搜索case表达式 case whe

随机推荐

  • .sh 文件 注释

    usr bin env bash 不需要寻找程序在系统中的位置 只要程序在 PATH中 根据环境寻找并运行默认的版本 set e exit the script if an error happens MODEL TAR depparse
  • 华为校招机试 - 单词重量(Java)

    题目描述 每个句子由多个单词组成 句子中的每个单词的长度都可能不一样 我们假设每个单词的长度Ni为该单词的重量 你需要做的就是给出整个句子的平均重量V 输入描述 无 输出描述 无 用例 输入 Who Love Solo 输出 3 67 说明
  • 计算机组成原理期末考试题

    计算机组成原理期末考试试题及答案 一 选择题 1 完整的计算机系统应包括 D A 运算器 存储器和控制器 B 外部设备和主机 C 主机和实用程序 D 配套的硬件设备和软件系统 2 计算机系统中的存储器系统是指 D A RAM存储器 B RO
  • 交换机端口安全

    文章目录 一 802 1X认证 1 定义和起源 2 认证方式 本地认证 远程集中认证 3 端口接入控制方式 基于端口认证 基于MAC地址认证 二 端口隔离技术 1 隔离组 2 隔离原理 3 应用场景 首先可以看下思维导图 以便更好的理解接下
  • MinIO文件服务器快速部署和案例演示

    MinIO文件服务器 文章目录 前言 服务器部署 依赖配置 SpringBoot配置 方法模板类 方法使用示例 易错点和注意点 MinIO的文件上传时文件类型设置的坑 前言 这个MinIO服务用起来比较简单 配置和使用都非常快 1 博客案例
  • css设置滚动条样式

    废话不多说 直接上代码 1 设置全局滚动条样式 webkit scrollbar 滚动条整体样式 width 4px 高宽分别对应横竖滚动条的尺寸 height 1px webkit scrollbar thumb 滚动条里面小方块 bor
  • 传智书城项目修改(修改图片、文本),使用eclipse修改, 以及解决出现的乱码问题

    在开始本教程先 请确保已经导入项目并能在网页中显示 导入项目参考http t csdn cn Bl0JX 一 修改首页顶部 首页效果如下 在项目文件中找到head jsp文件 在右侧的布局文件代码中修改首页的文字和首页logo 修改logo
  • weston设置

    weston设置 屏幕旋转180度方法 修改标题栏位置 启动配置文件 屏幕旋转180度方法 编辑 etc xdg weston weston ini文件 增加如下语句 output name DSI 1 transform 180 其中na
  • buuctf-Web1

    在登陆界面用sql注入的各种手段都没用 注册进去看看 抓包后发现数据包有点像xss 也能使它弹窗 但是好像没什么用 用标题1 会有关于sql语句的弹窗 但是如果抓包就不会出现 也能说明是单引号闭合 1 就不行 能知道是sql注入也不容易 闭
  • 用Python制作一个随机抽奖小工具

    大家好 我是才哥 最近在工作中面向社群玩家组织了一场活动 需要进行随机抽奖 参考之前小明大佬的案例 再结合自己的需求 做了一个简单的随机抽奖小工具 今天我就来顺便介绍一下这个小工具的制作过程吧 先看效果 1 核心功能设计 针对随机抽奖的小工
  • 自动控制原理知识点梳理——1. 自动控制的一般概念 & 2. 控制系统的数学模型

    目录 1 自动控制的一般概念 1 1知识梳理 逻辑图 2 控制系统的数学模型 2 1知识梳理 逻辑图 2 2补充内容 2 2 1传递函数的零点和极点 2 2 2典型环节及其传递函数 2 2 3相同的特征多项式和开环传递函数定义 2 2 4由
  • minecraft正版多人服务器,我的世界:“服务器的潜规则”,有的保护玩家,也有的打破平衡...

    多人联机 陪伴多数玩家的青春 点点滴滴 都是付出的时间与精力 如今 MC的 服务器 玩法愈来愈丰富 规则越来越多 那么 服务器内究竟有何潜规则呢 服务器控制台权限 gt OP权限 多数玩家都有这样的认为 OP权限在服务器中处在顶尖地位 那到
  • 税务大比武网络攻防复习(完整版)

    目录 信息化建设与管理 计算机终端设备 通信与网络 数据管理与应用 软件开发 计算与存储 基础设施保障 网络安全 网络安全基础 网络安全管理 密码学 软件开发安全 主机 数据库 中间件安全 网络与通信安全 网络攻击 信息收集 口令攻击和软件
  • uniapp小程序练手项目并上线

    如题 做一个自己的小程序 并在各大小程序开发者平台上线 背景 因没有小程序开发经验 且前端知识掌握得不好 作为一个小程序爱好者 总想有一款自己的小程序 同时也想有一款自己的app 虽然目前还没有实现 在整体难度上来说 小程序的实现比app的
  • 对数器的使用----bug测试,文章中含有测试源码

    当我们选择排序没有出现问题时 我们可以发现一个随机数组是有序的 会打印出 选择排序没有毛病 说明此时选择排序没有毛病 package cn Text public class LogarithmicDetector TODO 选择排序 pu
  • 2023省赛 飞机降落(dfs)

    看数据量 fact 10 3628800 直接暴力dfs include
  • firefly 搭建

    基本内容在http blog csdn net wangqiuyun article details 11150503里都有 在此仅记录搭建工程中遇到的问题及实际项目添加的工具 mysql安装 最好用5 6 服务启动不成功 基本是配置的问题
  • vue插件开发以及发布到npm流程——消息提示插件

    最近有兴趣学习了一下vue插件开发 以及发布到npm上 项目里可以直接使用自己开发的插件 以下文章以开发一个消息提示的组件为例 记录一下开发的流程 一 vue项目创建配置 创建vue项目的指令不多说 直接以下指令 这里我选择的vue2进行开
  • 校园二手物品交易系统微信小程序设计

    系统简介 本网最大的特点就功能全面 结构简单 角色功能明确 其不同角色实现以下基本功能 服务端 后台首页 可以直接跳转到后台首页 用户信息管理 管理所有申请通过的用户 商品信息管理 管理校园二手物品中所有的商品信息 非常详细 违规投诉管理
  • c语言源码解释,C语言一些细节注意(源码+解释)

    最近可能要回归底层开发设计 所以又看了看C的一些东西 顺便对一些问题进行了代码确认 现将代码贴出 希望对各位网友有所帮助 只是为了测试 没有按照什么规范写 代码风格比较烂 哈哈哈哈 大家见谅了 O