C语言编程题(五)sizeof结构体与字节对齐

struct A
{
    long num;
    char *name;
    short int data;
    char ha;
    short ba[5];
} *p;

int main()
{

    printf("结构体A的大小:%d\n", sizeof(struct A));
    printf("num的大小:%d\n", sizeof(((struct A *)0)->num));
    printf("name的大小:%d\n", sizeof(((struct A *)0)->name));
    printf("data的大小:%d\n", sizeof(((struct A *)0)->data));
    printf("ha大小:%d\n", sizeof(((struct A *)0)->ha));
    printf("ba的大小:%d\n", sizeof(((struct A *)0)->ba));
    return 0;
}

在32位机器上,在对齐为4情况下,sizeof(long)的结果为4字节,sizeof(char*)的结果为4字节,sizeof(short int)的结果与sizeof(short)的结果都为2字节,sizeof(char)的结果为1字节,sizeof(int)的结果为4字节

struct B
{
    float num;
    double b;
    char *name;
    char c;
   int data;

} *D;

结果为32:(4+4+8+4+1+3+4+4)橙色字体为填充的

strlen("\0")与sizeof("\0")

strlen("\0") = 0sizeof("\0") = 2

strlen
strlen用来计算字符串的长度,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值


#include <stdio.h>

int main()
{
	char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f'};
	char arr2[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};
	char arr3[] = {'a', 'b', 'c', '\0', 'e', 'f', '\0'};
	printf("%d\n", strlen(arr1));		// 答案为7,视编译器而定
	printf("%d\n", strlen(arr2));		// 答案为6
	printf("%d\n", strlen(arr3));		// 答案为3
	printf("%d\n", strlen("abc\0def")); // 答案为3

	printf("%d\n", sizeof(arr1));		// 答案为6
	printf("%d\n", sizeof("abcdef"));	// 答案为7
	printf("%d\n", sizeof(arr2));		// 答案为7
	printf("%d\n", sizeof(arr3));		// 答案为7
	printf("%d\n", sizeof("abc\0def")); // 答案为8

	return 0;
}

sizeof
sizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定

sizeof("\0") = 2,这是因为在C/C++中,字符串字面量(以双引号括起来的字符序列)包括其实际字符内容和一个null终止符('\0')作为字符串的结束标志。因此,字符串 "\0" 实际上包含两个字符:一个是null终止符,另一个是实际的字符。

void func0(){
    char array[] = "abcdefg";
    printf("%d ", sizeof(array));
    const char *p = "abcdefg";
    printf("%d ", sizeof(p));
}
void func1(char p[10])
{
    printf("%d ", sizeof(p));
}
void func2(char (&p)[10])
{
    printf("%d ", sizeof(p));
}
int main()
{
    char p[10] = "hello";
    func0();
    func1(p);
    func2(p);
    printf("%d ", sizeof(char[2]));
    printf("%d ", sizeof(char &));
    return 0;
}
  • 在调用func0函数时,定义了一个字符数组array并初始化,其大小为7,因为包括末尾的'\0'字符。
  • 而指针变量p只是指向了字符串常量"abcdefg",占用的内存空间大小与指针类型相关,一般情况下是4或8个字节。所以第一个printf输出7,第二个printf输出4或8。
  • 在调用func1func2函数时,传入了一个大小为10的字符数组p,但是在func1中,p被视为指向字符的指针,并不知道它的大小,所以输出的大小为4或8;
  • 而在func2中,p被视为一个大小为10的字符数组的引用,所以输出大小为10
  • 最后两行printf分别输出sizeof(char[2])sizeof(char &),前者表示字符数组char[2]的大小,即两个字符占用的空间大小,为2;
  • 后者表示对字符的引用占用空间大小,一般为1个字节。

C语言 sizeof操作符详解-CSDN博客

C语言 sizeof(struct)讲解_sizeof(struct)-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值