C语言 sizeof, size_t, strlen
文章目录
- C语言 sizeof, size_t, strlen
- 一. sizeof
- 1.1 返回结构体长度
- 二. size_t
- 三. sizeof 和 strlen
一. sizeof
返回一个结构体或者类型所占的内存字节数
1.1 返回结构体长度
这里我编写了2个结构体,区别在于数组问题
#include <stdio.h>
struct test{
int length;
int space;
char arr[];
};
struct _test{
int length;
int space;
char *arr;
};
int main(){
printf("%d\n",sizeof(struct test));
printf("%d\n",sizeof(struct _test));
return 0;
}
编译c文件,查看结果
[root@localhost second-six]# gcc demo_sizeof.c
[root@localhost second-six]# ./a.out
8
16
从这里我们可以看出定义char arr[]和char *p,输出的结果不同
-
char arr[],初始化为0字节,需要到时在堆内存赋值长度,拿一个redis2.8.14源码示例,sds.c文件
可变数组,在编译期生成,没有编译期不生成,必须动态分配
sds sdsnewlen(const void *init, size_t initlen) {
struct sdshdr *sh;
if (init) {
// 初始化内存
sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
} else {
// 初始化内存
sh = zcalloc(sizeof(struct sdshdr)+initlen+1);
}
if (sh == NULL) return NULL;
sh->len = initlen;
sh->free = 0;
if (initlen && init)
memcpy(sh->buf, init, initlen);
sh->buf[initlen] = '\0';
return (char*)sh->buf;
}
// 结构体
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
-
char *arr,可通过汇编看出
默认赋值16,而char *arr相当于初始化机器的位数,如机器是64bit,则初始化8byte
[root@localhost second-six]# gcc -S -fno-asynchronous-unwind-tables demo_sizeof.c
[root@localhost second-six]# cat demo_sizeof.s
.file "demo_sizeof.c"
.text
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp
movl $8, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $16, %esi //默认赋值16
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
ret
.size main, .-main
.ident "GCC: (GNU) 9.3.1 20200408 (Red Hat 9.3.1-2)"
.section .note.GNU-stack,"",@progbits
二. size_t
由于存放当前地址值不知当前机器平台的位数,并保证代码具有可移植性,定义一个关键字size_t在使用当前平台位数来初始化.
通过size_t获取int内存存储大小
#include <stdio.h>
int main(){
int a = 1;
size_t b =(size_t)&a;
size_t c =(size_t)((&a)+1);
printf("%d\n", c - b);
return 1;
}
输出结果
[root@localhost second-six]# gcc demo_size_t.c
[root@localhost second-six]# ./a.out
4
三. sizeof 和 strlen
sizeof() 算的是总空间大小,运算符
strlen() 算的是加到\0之前的大小,函数
[root@localhost second-six]# cat demo_sizeof3.c
#include <stdio.h>
#include <string.h>
int main(){
printf("%d\n", sizeof("hello"));
printf("%d\n", strlen("hello"));
printf("%d\n", sizeof("hel\0lo"));
printf("%d\n", strlen("hel\0lo"));
}
输出结果
[root@localhost second-six]# gcc demo_sizeof3.c
[root@localhost second-six]# ./a.out
6
5
7
3