几个C语言中的易混淆点

1.数据类型的字节数
int类型通常代表特定机器的自然长度,可以是16位或32位;short类型通常是16位;long类型通常是32位
类型的位数一般只对编译器可见,位数是多少可用sizeof来看,各编译器可根据硬件的特性自主的选择类型位数,但必须遵循特定的规则:short型和int型至少为16位,long型至少为32位,而且short不得超过int型,int型不得超过long型。有一点是编译器在自主选择类型时要受到OS位数的限制,而OS又要受到CPU可寻址位数的限制,32的CPU当然最大为32位(不过听说可扩展……)。

2.结构体

结构体所占内存大小问题:

结构体所占内存大小与结构体的对齐方式有关
编译器为了优化cpu读取内存的效率,在生成结构体成员的起始地址时遵循着某种特定的规则,这就是所谓的“内存对齐”方式。这个规则为“对于n个字节(n=1、2、4、、、、就是short、int等)的元素,它的首地址能被n整除”;而且结构体中的成员在内存中是顺序存放的,所占内存地址一次增高,第一个字节出于低地址处,最后一个字节位于搞地址处,但结构体成员的内存分配不一定是连续的,编译器会按照前面介绍的成员对齐方式进行处理。 其实每个编译器也可以设置一个默认的对齐方式n,但这个n并不一定是实际的对齐方式,实际对每个元素的对齐参数N要按照这个原则:“N=min(sizeof(成员变量),n)”进行分配,最后整体的要求是:“对这个结构体所占用的内存一定是其成员中最大对齐参数N(与编译器的默认参数比较过的)的最小整数倍,不足时补空字节”【另外结构体对齐的具体实现也与硬件有关,就是CPU的“字节序”问题,有的是“小端”有的是“大端”】

什么时候为结构体分配内存?:
其实在C++中结构体和类没什么区别,只是变量的默认权限不一样,在这里也可以当做类来理解,就是当只写:typedef struct _temp{...}时,只是定义了一个类,并没有对齐实例化,当然也就没有为其分配内存,当用struct _temp temp;定义了一个变量temp,也就是相当于创建了一个实例,也就分配了内存,只是这时,在这个变量中的成员的地址中存放的并不是你想要的值,什么乱七八糟的值都有可能,所以在定义之后最好初始化。


3.在C中有没有string类型
  在C中没有string类型,在C++中才有,在C中string就是以‘\0’结尾的字符数组,而且在C中也不可能写一个替代,因为在C++中string类型是数据和操作封装在一起的,在C不可能实现,但在C中在string.h中定义了strstr( ,)、strncat( , , )等对字符数组(也就是字符串)的处理函数。在C++中使用string类型时,也要调用<string>头文件,注意这里在新的C++中不用<string.h>,而与C中的string.h相对应的库函数在<cstring>中,注意<cstring.h>库函数已经废弃,还有在使用<string>这一类头文件中的函数、变量时,最好用“using namespaces std;”(不过也有的说“在使用stl空间中的类/函数/模板时才使用这一句”)防止重名。

4.char *a="abc"与char a[]="abc"的区别
  一个在栈中,一个在堆中

char *a="abc":

其中"abc”存放在常量存储区,a存放在栈中,a指向"abc"在常量存储区的首地址,常量存储区中的内容为只读,不可修改,a[0]='e';//错误;在编译的过程中进行初始化,在程序结束时由系统释放。

char a[]="abc":

存放在栈中,在程序运行的过程中初始化,可修改内容,a[0]='e';//ok,在程序执行完其作用域时释放。

<think>好的,我现在需要回答用户关于C语言中斜杠n占几个字节的问题。首先,我得确认用户的问题具体是什么。用户问的是“斜杠n”,也就是转义字符\n在C语言中占用的字节数。 首先,我要回忆C语言中的转义字符相关知识。转义字符以反斜杠开头,后面跟一个或多个字符,表示特殊含义。常见的比如\n代表换行,\t代表制表符等等。每个转义字符在内存中存储为对应的ASCII码值。例如,\n对应的ASCII码是10,属于一个字符,因此在内存中占1个字节。 不过,用户可能容混淆的是,当在源代码中写入\n时,写的是两个字符(反斜杠和n),但在编译后的程序中,它会被转换成一个字符。因此,这里需要分清楚源代码中的字符数量和编译后实际占用的内存空间。 比如,在代码中写printf("Hello\n");,这里的字符串"Hello\n"在编译后的可执行文件中,\n会被视为一个换行符,占用1个字节。而源代码中的两个字符(\和n)在编译后合并为一个字节。 可能存在的误区是用户可能认为\n在内存中和在代码中一样占两个字节,但实际并非如此。需要明确说明两者的区别:源代码中的表示和编译后的存储不同。 另外,需要考虑不同的字符编码是否会影响结果,不过C语言中的转义字符通常使用ASCII编码,每个字符都是1个字节,无论是什么环境,所以一般情况下都是1个字节。除非涉及到宽字符或多字节编码,但在标准C中,\n作为换行符依然是单字节的。 总结起来,应该分两解释:在源代码中,\n作为两个字符出现,但在编译后的字符串中,它被转换为一个字节的换行符。因此,占用的是1个字节的内存空间。</think>在C语言中,转义字符 `\n`(换行符)的存储和占用空间问题需要分两个层面理解: --- ### 1. **源代码中的表示** 在C语言源代码中,当您写下 `\n` 时,它由两个字符组成:反斜杠 `\` 和字母 `n`。 但这里的 `\n` 是一个**转义字符**,编译器会将其视为一个**整体**,代表换行符的ASCII值(十进制为10)。 --- ### 2. **编译后的存储** 在编译后的程序中,`\n` 会被转换为**1个字节**的二进制值(即ASCII码 `0x0A`)。例如: ```c printf("Hello\n"); ``` - 字符串 `"Hello\n"` 包含6个字符:`H`, `e`, `l`, `l`, `o`, `\n`。 - 每个字符(包括 `\n`)占用**1个字节**,因此总长度为6字节。 --- ### 关键区别 - **源代码层面**:`\n` 是两字符的写法,但仅表示一个逻辑符号。 - **内存层面**:`\n` 最终存储为1字节的ASCII值。 --- ### 验证方法 可通过 `sizeof` 或 `strlen` 验证: ```c char str[] = "Hello\n"; printf("字符串长度:%zu\n", strlen(str)); // 输出6(包含\0之前的字符数) printf("存储大小:%zu\n", sizeof(str)); // 输出7(包含结尾的\0) ``` --- ### 总结 `\n` 在内存中占用 **1个字节**。它是通过转义序列表示的单个字符,实际存储时与其逻辑含义对应,与源代码中的写法无关。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值