一. 简介
整理一些C语言常见的基础笔试题。
假如系统是 32位计算机的情况下,字节对齐方式为 4字节对齐。计算如下题目。
二. 常见C语言基础笔试题
1. 计算 sizeof(数组名), sizeof(指针),strlen(数组名) 大小
计算如下的变量的值:
#include <stdio.h>int main(void)
{ char str[] = "123456";char *ptr;int b[100] = "0123456789";printf("%d, %d, %d\n", sizeof(str), sizeof(ptr), strlen(str));printf("%d\n", sizeof(b));return 0;
}
打印结果如下:
7, 4, 6
400
分析:
sizeof在编译时期就计算出来,strlen在运行之后才能计算出来。
strlen 计算字符串的具体长度(只能是字符串),不包括字符串结束符。返回的是字符个数。strlen参数只能是char*,且必须是以 '\0' 结尾。
sizeof 计算声明后所占的内存数(字节大小),不是实际长度。
为什么需要 sizeof ?
主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统中为4字节,在16位系统中为2字节···)。所以程序中需要使用 sizeof 来判断当前变量/数据类型在当前环境下占几个字节。
sizeof(str):char str[] 这里的 str是一个数组,sizeof(str) 即计算数组,因为内部是字符串,所以包括 '\0' 位置,所以为 sizeof(str)为 6+1,即 7。
sizeof(ptr) :ptr是一个 char类型的指针,注意是指针,而 32位系统中 指针所占用的字节大小为 4字节,所以,sizeof(ptr) 为 4,。也就说无论什么类型的指针,sizeof(ptr) 都是 4字节(对于 32位计算机系统而言)。
sizeof(b) :因为 b为 int 类型数组,而一个 int类型占 4字节(32位计算机系统中)所以,sizeof(b) 为 4*100,即 400。
strlen(str): strlen() 是计算字符串长度,不包括字符串结束符 '\0'。所以, strlen(str)为 6.
2. 结构体指针 + 1
结构体指针加 1操作:
#include <stdio.h>
#include <stdlib.h>typedef struct tagDev_INFO_S{int a;int b;int c;int d;
} DEV_INFO_S;int main(void)
{ DEV_INFO_S * pstDevInfo = malloc(sizeof(DEV_INFO_S)*8);printf("pstDevInfo: %p\n", pstDevInfo);printf("pstDevInfo+1: %p\n", pstDevInfo+1);return 0;
}
打印结果如下:
可以看出,结构体指针 +1的意思就是,也就是加一个步进,步进的大小就是指向的类型的 sizeof的结果。
这里结构体大小为 4字节*4 = 16字节,结构体指针加 1,也就是 相差一个结构体大小即 16个字