C语言常见问题

2023-11-19

问题1:sizeof与strlen区别

1、sizeof()

sizeof()是一种单目操作符,是用来计算你所使用的操作数所占的空间字节大小。
可以以类型、指针、数组和函数等作为参数,返回值类型为unsigned int。

2、strlen
strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。

#include <stdio.h>
#include <string.h>

int main()
{
	char a[] = "abc";
    int b;
    int c;
    
    printf("%d\n",sizeof(a));
    printf("%d\n",strlen(a));

	return 0;
}

输出结果

4                                                                                                               
3

问题2:main函数三个参数

1.int argc 整型变量

2.char *argv[] 字符指针的数组,通俗一点就是字符串数组,每个元素都是字符串

3.char *envp[] 字符串数组

问题3:全局变量和局部变量的区别

1.作用域不同:全局变量的作用域为整个程序,局部变量的作用域为当前语句块;

2.内存储存方式:全局变量存储在全局数据区,局部变量存储在栈上;

3.生命周期不同:全局变量的生命周期和程序一样,局部变量随着语句块的结束而结束;

4.当局部变量与全局变量同名时,优先使用局部变量。

问题4:程序的内存分配

运行程序的内存分为堆区、栈区、BSS区、数据区(初始化)、代码区。

  • 栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
  • 堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。
  • 全局区(静态区static):存放全局变量、静态数据、常量。程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)。
  • 常量区(文字常量区):存放常量字符串,程序结束后有系统释放。
  • 代码区:存放函数体(类成员函数和全局区)的二进制代码。
//main.cpp
int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b;char s[] = ”abc”; //栈
char p2; //栈
char p3=123456; //123456\0 在常量区,p3 在栈上。
static int c=0//全局(静态)初始化区
p1 = (char)malloc(10);
p2 = (char)malloc(20); //分配得来得 10 和 20 字节的区域就在堆区。
strcpy(p1,123456); //123456\0 放在常量区,编译器可能会将它与 p3 所向”123456″优化成一个地方。
}

从静态存储区分配

内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

在栈上创建

在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行结束时,这些内存单元会自动被释放。
栈内存分配运算内置于处理器的指令集,效率高,但是分配的内存容量有限。

从堆上分配

动态内存分配。
程序在运行的时候使用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生命周期有程序员决定,使用非常灵活,但如果在堆上分配了空间,既有责任回收它,否则运行的程序会出现内存泄漏,频繁的分配和释放不同大小的堆空间将会产生内存碎片。
请添加图片描述

问题5:结构体和联合体的区别

结构体中,各成员占有自己的储存空间,总大小等于各成员的大小之和。
联合体中,所有成员公用一块储存空间,其大小等于联合体中最大成员的大小。

问题6:指针函数和函数指针的区别

指针函数
指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针

 类型标识符    *函数名(参数表)

 int *f(x,y);

函数指针
函数指针是指向函数的指针变量,即本质是一个指针变量,这个指针指向的对象是一个数组。

int (f) (int x);	/* 声明一个函数指针 */
f=func; 			/* 将func函数的首地址赋给指针f */

这个特殊的指针指向一个返回整型值的函数。
例如:

void (*fptr)();

把函数的地址赋值给函数指针,可以采用下面两种形式:

fptr=&Function;
fptr=Function;

最简单的辨别方式就是看函数名前面的指针号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。*

问题7:指针自增自减与变量自增自减有什么区别?

指针自增自减是改变指针所指向的对象,变量自增自减是改变变量的值;

问题8:#include <stdio.h>#include "stdio.h"的区别?

<stdio.h>表示的是该文件存在编译器指定的标准头文件存放处

"stdio.h"表示的是该文件在用户当前的工作目录下

问题9:用#define实现宏并求最大值与最小值

#define MAX(X,Y) ((X)>(Y)?(X):(Y))

#define MIN(X,Y) ((X)<(Y)?(X):(Y))

三目运算符:(a ? y : z
先判断条件 a 真假,如果 a 的值为 true ,那么返回表达式 y 的计算结果;否则,计算 z 的值,返回表达式 z 的计算结果。

问题10:static与const关键字的区别

  • static关键字

(1)static 全局变量 :表示该变量是静态全局变量,在当前文件的全局内可访问。

(2)static 函数 :该函数为静态函数,只能在本文件中调用;静态函数在内存中只有一份,普通函数在内存中只有一份拷贝。

(3)static局部变量:为静态局部变量,只初始化一次,之后调用函数都是上次函数退出的值。这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中。

(4)static成员函数:表示这个函数为全类所共有,而且只能访问静态成员变量。

(5)static成员变量:表示这个成员为全类所共有。

  • const 关键字

(1)const 常量:定义时就初始化,以后不能更改。
const 形参:该形参在函数里不能改变

func(const int a)
	{
	
	};

const修饰类成员函数:该函数对成员变量只能进行只读操作

(2)修饰数组:修饰符const可以用在类型说明符前,也可以用在类型说明符后;例如:int const a[5]={1,2,3};或 const int a[5]={1,2,3};

(3)修饰常指针:const int *A; //const修饰指针指向的对象,指针可变,指针指向的对象不可变;

举例:
int const *A; //修饰指针指向的对象,指针可变,指针指向的对象不可变;
int *const A;//const修饰指针,指针不可变,指针指向的对象可变;

const int *x ---->x的地址可以输出但是数据不能输出
int const *x ---->x的地址可以输出但是数据不能输出
int *const x ---->x的地址不可以输出但是数据可以输出
const int *const x ---->x的地址和数据都不能输出
总结:左数右址 (数表示数据,指表示变量的地址 ,左右就是const在指针变量的左边或者右边)

问题11:malloc()

malloc是从堆上动态申请内存空间,malloc只有一个参数,即要分配的内存大小。malloc不能对内存初始化。

int* p;

p = (int *) malloc (sizeof(int));

malloc 函数返回的是 void * 类型,必须通过 (int *) 来将强制转换。

malloc函数在动态分配数组空间时,只会增大空间,不会减小空间,所以说如果不释放内存,可能会造成内存溢出。因为如果地址没了,内存被占了但是还无法调用,就很难受。
所以此时我们调用free();函数释放内存
一般地,对应每个malloc()调用,应该调用一次 free()函数free ()的参数是先前malloc ()返回的地址,它释放先前分配的内存。

问题12:strcpy、sprintf和memcpy的区别

char*strcpy(char *dest, const char *src);
int sprintf(char*str, const char *format, ...);
void *memcpy(void*dest, const void *src, size_t n)
  1. 复制的内容不同。
    strcpy只能复制字符串;sprintf 函数操作的对象 不限于字符串;而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

  2. 复制的方法不同。
    strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

  3. 用途不同。
    通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
    sprintf主要用来实现(字符串或基本数据类型)向字符串的转换 功能。

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

C语言常见问题 的相关文章

随机推荐

  • html中如何写div中div的位置,position设置div的位置

    css怎么调整div的位置 可以使用css中的position来对div进行定位来改变div的位置 position可能的值如下 工具原料 编辑器 浏览器 通过设置一个div的position的值来调整div的位置 简单的代码示例如下 bo
  • C语言基础系列(四)——数组

    本期主题 c语言中的数组 C语言基础 数组 1 数组名 1 1 数组名的含义 2 空数组的用法 1 数组名 指针常量 特殊情框 2 指针数组 数组指针 3 空数组 1 数组名 1 1 数组名的含义 可以先看下面的这些声明 int a int
  • Java 工作2年后需要达到怎么样的技术水平

    请具体一点说要会什么技术 以及这些技术要达到什么水平 有人回答说这只能是大企业或者互联网企业的工程师才能拿到 也许是的 小公司或者非互联网企业拿两万的不太可能是码农了 应该是已经转管理后才有可能 还有区域问题 这个不在我的考虑范围内 因为除
  • qq键盘快捷键大全

    qq键盘快捷键大全 Ctrl A 全选 Ctrl B 整理收藏夹 Ctrl C 复制 Ctrl D 删除 添加收藏 在Word中是修改选定字符格式 在IE及傲游 中是保存为收藏 Ctrl E 搜索助理 在Word中是段落居中 Ctrl F
  • 哈希函数

    哈希函数 定义 Hash 一般翻译做散列 杂凑 或音译为哈希 是把任意长度的输入 又叫做预映射pre image 通过散列算法变换成固定长度的输出 该输出就是散列值 这种转换是一种压缩映射 也就是 散列值的空间通常远小于输入的空间 不同的输
  • 国产数据库梳理

    背景介绍及架构介绍 架构上划分 分库分表类 Spanner 架构 OceanBase Shared Storage 总结 当前国产数据库百花齐放 几乎每隔半年就会冒出一家数据库 各大厂商在去年也都更新了自己的数据库产品线名称 太多的数据库让
  • Winrar命令行解压带密码的压缩文件

    1 先自行安装好winrar 这个不用多说 2 我们创建一个压缩文件 这是一个文件夹 里边就2个txt文件 3 我们使用winrar对其进行加密压缩 现在我们就有一个带密码的压缩文件了 3 找到winrar的安装目录 把rar exe拷贝到
  • matlab读入从文件中读取大量的数据

    将文件导入matlab中 除了对利用菜单的操作 我们也可以使用matlab代码 这个是一个函数 这个函数我们提供所读文件的基础的名字 然后返回一个矩阵 function z readOneD basename readOneD BASENA
  • 我认为最好用的网页解析模块Parsel

    前言 众所周知 网页解析4大模块 1 正则表达式 re 2 bs4 BeautifulSoup 3 xpath lxml 4 css选择器 pyquery 大家一定都很熟悉 很多都是从这几个模块入手 本文不对这4个模块评价它们的优略 因为每
  • 攻防世界fileinclude题解

    目录 解题思路 file get contents 函数 PHP伪协议 解题思路续 解题思路 先看题目 打开题目场景 我们看到用了file get contents 函数 这里我忘了这个函数是什么意思了 于是又去翻了翻文档 file get
  • IDEA卡顿怎么办?快来用用这个办法

    IDEA卡顿解决方法 亲测有效 1 找到IDEA安装位置 打开这两个配置 2 修改配置 3 保存配置 重启IDEA 先介绍一下我电脑的情况 华硕dx80 8g运行 电脑配置一般 在跟同等价位的拯救者同时打开IDEA时 打开速度都差好多 为了
  • 分布式缓存数据库面试题redis

    redis和memcached什么区别 为什么高并发下有时单线程的redis比多线程的memcached效率要高 区别 1 mc可缓存图片和视频 rd支持除k v更多的数据结构 2 rd可以使用虚拟内存 rd可持久化和aof灾难恢复 rd通
  • Day 2 – 布尔值,字符串插值

    如何创建布尔值 布尔值是一种数据类型 用于存储逻辑真假值 在Swift中 布尔值用true和false表示 布尔值通常用于控制程序的流程和逻辑 let goodDogs true let gameOver false let isMulti
  • Active Directory 与域

    1工作场景导入 工作场景 XYZ公司是一家大型制造企业 公司有许多内设部门 车间和分厂 在全国各地有许多分公司 该公司总部信息中心有各类服务器30余台 各车间 分厂和分公司都有自己的服务器 客户机近千台 目前 该公司的各类应用大多基于Win
  • linux 查看JVM默认参数 (centos7)

    情景 之前学习过 深入了解JVM虚拟机 习得了一些JVM方面的一些知识 但是并没有相应的实战 虽然没有相应的实战 但是 咱们也得知道如何查看JVM默认参数 以及如何修改相应的JVM参数 查看命令 1 显示出JVM初始化完毕后所有跟最初的默认
  • C语言:递归实现输出一个整数的逆序

    任务描述 题目描述 编写一个递归函数 将一个整数n逆序输出 比如 n 12345 输出54321 相关知识 略 编程要求 请仔细阅读右侧代码 结合相关知识 在Begin End区域内进行代码补充 输入 一个整数n 输出 该整数的逆序 测试说
  • 蓝桥杯.卡片(模拟)

    Question Result 3181 Solve 直接模拟暴力 初始化卡片数量为2021 去模拟拼数的过程 注意点的话 我是先去判断卡片还有没有 再去减一 所以输出结果也有一个减一 因为一旦说卡片没有了 就意味着当前这个数字拼不成了 C
  • chmod 777 权限恢复问题 /etc/sudoers.d

    etc sudoers d问题 2016年07月27日 15 09 45 阅读数 1130 下述问题是由于我更改了整个 etc文件夹的权限后产生的 问题描述 sudo etc sudoers 可被任何人写 sudo no valid sud
  • tpcc mysql下载_TPCC安装和压测数据库数据表创建生成

    下载TPCC mysql root cnbugs1 git clone https github com Percona Lab tpcc mysql git 配置TPCC mysql root cnbugs1 mv tpcc mysql
  • C语言常见问题

    问题1 sizeof与strlen区别 1 sizeof sizeof 是一种单目操作符 是用来计算你所使用的操作数所占的空间字节大小 可以以类型 指针 数组和函数等作为参数 返回值类型为unsigned int 2 strlen strl