C语言
文章平均质量分 53
树下等苹果
这个作者很懒,什么都没留下…
展开
-
while里面scanf()被忽略的解决办法
一、问题运行以下代码:#include<stdio.h>#include<stdlib.h>int main(){ int a, b; char c=NULL; while (c!='n') { printf("请输入a的值:"); scanf_s("%d", &a); switch (a) { case 1:printf("%d", a * a); break; case 2:printf("%d", a * a); break;原创 2021-11-07 22:20:03 · 506 阅读 · 0 评论 -
在while里使用scanf_s,输出带有“[“的解决方案
一、问题在while中使用scanf_s函数,出现以下问题:出错代码:#include<stdio.h>int main(){ char c; while (scanf_s("%c", &c) != EOF) { printf("%c", c+ 4); } return 0;}输出结果:输出结果应该是“E”,但是多了“[”。二、解决方法将while中修改如下即可解决:scanf_s("%c", &c) != EOF &&原创 2021-11-07 16:23:51 · 166 阅读 · 0 评论 -
C语言相关常见面试题:volatile、static、extern、const关键字
1、volatile一个变量可能是供多方使用的,那么就有可能在某一个程序运行时,这个变量的值被其他程序改变(内存地址中的值被改变),但是读取这个变量时,可能是直接从寄存器中读取,而此时寄存器中的值还是变量改变之前的值。这就会导致得出意想不到的结果。使用volatile修饰变量,表示声明这个变量是“易变的”,每次读取这个变量值都要从内存中读取,而不是从寄存器中读取。1.1 volatile的作用:确保本条指令不会因编译器的优化而省略,使用volatile 声明的变量的值的时候,系统总是重新从它所在的内原创 2021-10-26 23:16:13 · 562 阅读 · 0 评论 -
关于内存的编程题,对异常: 0xC0000005 的分析以及解决办法
一、内存的思考题。请问运行Test函数会有什么样的结果?void GetMemory(char *p){ p = (char *)malloc(100);}void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf("%s", str);}结果:在语句strcpy(str, "hello world")发生错误。引发的异常: 0xC原创 2021-10-10 21:07:46 · 4058 阅读 · 2 评论 -
指针用作函数参数,形参和实参用不用指针的区别
一、实参与形参都不是指针,通过修改形参的值来改变实参的值结果:不可以改变实参的值#include<stdio.h>int swap(int a,int b){ int temp; temp = a; a = b; b = temp; return 0;}int main(){ int a=2, b=4; printf("%d\t%d\n", a, b); swap(a, b); printf("%d\t%d\n", a, b); return 0;}输出:原创 2021-10-10 20:10:09 · 1926 阅读 · 0 评论 -
解决数组过大导致Stack Overflow的两个方法:改变栈大小和使用堆来存放数组
一、检查以下代码的问题,并进行修改int a[20][650][1000],i,j,k; for (i = 0; i < 20; i++) for (j = 0; j < 650; j++) for (k = 0; k < 1000; k++) a[i][j][k] = 0;出错信息:0xC00000FD: Stack overflow (参数: 0x00000000, 0x00E42000)。即栈溢出,通常来说,栈的大小为1024K bytes=102410原创 2021-10-09 00:23:32 · 2524 阅读 · 1 评论 -
快速理解内存对齐以及#pragma pack
一、内存对齐目的与原理1、内存对齐的目的假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5,6,7地址),最后留下的两块数据合并放入寄存器.这需要做很多工作。现在有了内存对齐的,int类型数据只能存放在按照对齐规则的内存中,比如说0地址开始的内存。那么现在该处理器在取数据时一次性就能将数据读出来了,而且不需要做额外原创 2021-08-13 20:53:36 · 4195 阅读 · 2 评论 -
C语言:逻辑表达式中不能使用浮点数进行==和!=的解决方法
一、问题在C语言中,不能使用浮点数进行==和!=运算,比如以下代码:#include<stdio.h>int main(){ float a = 3.14; if (a == 3.14) { printf("%f",a); } return 0;}运行后会报错,如下:二、原因C语言中,==和!=是双目运算符,在进行运算时会把两边的数或者变量转换成二进制数来进行对比,从而来判断其相等或是不等。对于整数来说,可以将之转换为对应确定的二进制数;但对于浮点数来说,原创 2021-08-07 16:44:03 · 2200 阅读 · 1 评论 -
C语言随机函数:rand()和srand()的使用及示例
一、rand()函数1、rand()函数原理rand()函数用于产生一个随机数,其内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。调用rand()函数会得到一个在0-RAND_MAX。RAND_MAX在头文件stdlib.h中定义。2、调用方法想要使用rand()函数产生一个(a,b)区间的数num,可以使用以下两种方式:(1)num=a+(b-a+1)*rand()/(RAND-MAX+1.0);(2)a+rand%(b-a+1);注意公式(1)用的原创 2021-07-18 00:56:51 · 48000 阅读 · 7 评论 -
牛客网:段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起
在牛客网刷题,发现即使通过了自测输入,但仍然不能通过,总是出现“段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起”的报错。题目:写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写。我一开始写的代码如下:#include<stdio.h>#include<string.h>int main(){ char str1[50]; char letter; int cou原创 2021-04-14 21:03:08 · 4849 阅读 · 0 评论 -
嵌入式工程师笔试题
1、在64位机器上分别使用-m32和-m64编译如下代码并在64位机器上执行,则输出为:#include <stdio.h>int main(int argc, char * argv[]){ void* number = 0; printf("%d\n",sizeof(&number));}解析:考查知识点:(1)-m32选项将int,long和指针设置为32位,并生成在任何i386系统上运行的代码。(2)-m64选项将int设置为32位和l原创 2021-04-12 21:54:53 · 2558 阅读 · 1 评论 -
虚函数和纯虚函数
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。 1、简介 假设我们有下面的类层次: class A{public: virtual void foo() { ...转载 2021-04-12 21:36:16 · 906 阅读 · 0 评论 -
C语言——指针运算示例
/*指针运算示例*/#include<stdio.h>int main(){ int i, a[] = { 1,2,3,4,5 }, * p = a; for (i = 0; i < 5; i++) printf("%d\n", a[i]); //循环输出a[i]的值 printf("a = %d\n", p); //输出数组a的首地址,即a[0]的地址 printf("p + 2 = %d\n", p + 2); //输原创 2021-03-14 11:37:22 · 145 阅读 · 0 评论 -
C语言中调用数组元素的三种方法:下标法、数组名法、指针法
/*调用数组元素的三种方法:下标法、数组名法、指针法*/#include<stdio.h>int main(){ int a[] = { 1,2,3,4,5 }, i, * p; printf("用下标引用数组元素:\n"); for (i = 0; i < 5; i++) printf("%d\n", a[i]); printf("用数组名引用数组元素:\n"); for (i = 0; i < 5; i++) printf("%d\n", * (a+i))原创 2021-03-14 10:54:19 · 8820 阅读 · 0 评论