0

0

c语言中的sizeof运算符有什么用 如何用sizeof计算数组长度

下次还敢

下次还敢

发布时间:2025-07-04 18:25:02

|

1197人浏览过

|

来源于php中文网

原创

sizeof运算符在c语言中用于确定变量、数据类型或表达式在内存中所占的字节数。1. 它在编译时求值,适用于变量、数据类型和表达式,返回size_t类型的值;2. 可计算数组长度,通过整个数组大小除以单个元素大小实现;3. 用于指针时返回指针本身的大小,而非指向数据的大小;4. 在函数中对数组使用sizeof会退化为指针,导致无法正确计算数组长度;5. 处理结构体时考虑内存对齐,联合体大小等于最大成员的大小;6. 常用于动态内存分配,确保分配正确的字节数;7. 支持类型安全编程,避免硬编码数组长度;8. c99标准中支持可变长数组(vla),其大小在运行时计算。理解sizeof的特性和注意事项有助于编写高效可靠的c代码。

c语言中的sizeof运算符有什么用 如何用sizeof计算数组长度

sizeof运算符在C语言中主要用于确定变量或数据类型在内存中占用的字节数。它在编译时求值,而非运行时,这使得它在某些情况下非常有用,比如动态内存分配或处理不同数据类型的数组。

c语言中的sizeof运算符有什么用 如何用sizeof计算数组长度

sizeof运算符能帮助你理解数据结构在内存中的布局,以及在进行内存操作时确保正确的字节对齐。

c语言中的sizeof运算符有什么用 如何用sizeof计算数组长度

sizeof运算符的基本用法

sizeof 可以应用于变量、数据类型或表达式。它返回一个 size_t 类型的值,表示所求对象的大小(以字节为单位)。

立即学习C语言免费学习笔记(深入)”;

c语言中的sizeof运算符有什么用 如何用sizeof计算数组长度
  • sizeof(变量): 返回变量所占用的内存大小。
  • sizeof(数据类型): 返回该数据类型所占用的内存大小。
  • sizeof(表达式): 返回表达式结果的数据类型所占用的内存大小,表达式本身不会被求值。

例如:

#include 

int main() {
    int a = 10;
    float b = 3.14;
    char c = 'A';

    printf("Size of int: %zu bytes\n", sizeof(int));
    printf("Size of variable a: %zu bytes\n", sizeof(a));
    printf("Size of float: %zu bytes\n", sizeof(float));
    printf("Size of variable b: %zu bytes\n", sizeof(b));
    printf("Size of char: %zu bytes\n", sizeof(char));
    printf("Size of variable c: %zu bytes\n", sizeof(c));

    return 0;
}

这段代码会输出 intfloatchar 类型以及相应变量的大小。注意 %zu 是用来打印 size_t 类型的值的格式说明符。

如何使用sizeof计算数组长度

计算数组长度是 sizeof 的一个常见用途。对于静态数组,可以在编译时确定其长度。

#include 

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    size_t array_size = sizeof(arr); // 整个数组的大小
    size_t element_size = sizeof(arr[0]); // 数组中一个元素的大小
    size_t array_length = array_size / element_size; // 数组长度

    printf("Array size: %zu bytes\n", array_size);
    printf("Element size: %zu bytes\n", element_size);
    printf("Array length: %zu\n", array_length);

    return 0;
}

这段代码中,sizeof(arr) 返回整个数组占用的总字节数,而 sizeof(arr[0]) 返回数组中一个元素占用的字节数。两者相除即可得到数组的长度。

sizeof用于指针时的注意事项

sizeof 应用于指针时,它返回的是指针本身占用的内存大小,而不是指针指向的数据的大小。指针的大小通常是固定的,取决于系统架构(例如,32位系统上指针通常是4字节,64位系统上是8字节)。

#include 

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = arr;

    printf("Size of pointer: %zu bytes\n", sizeof(ptr)); // 指针的大小
    printf("Size of int: %zu bytes\n", sizeof(int));     // int的大小

    return 0;
}

这段代码会输出指针 ptr 的大小,这通常是4或8字节,取决于你的系统。注意,即使 ptr 指向一个整数数组,sizeof(ptr) 返回的仍然是指针本身的大小,而不是整个数组的大小。

这意味着,如果你将数组传递给一个函数,并在函数内部使用 sizeof 来计算数组长度,你会得到错误的结果,因为数组会退化为指针。

为什么在函数内部使用sizeof计算数组长度会出错?

当数组作为参数传递给函数时,它会退化为指向数组首元素的指针。这意味着在函数内部,你只能获取到指针的大小,而无法获取到整个数组的大小。

#include 

void print_array_length(int arr[]) {
    size_t array_size = sizeof(arr); // 实际上是指针的大小
    size_t element_size = sizeof(arr[0]); // 数组元素的大小
    size_t array_length = array_size / element_size; // 错误的数组长度

    printf("Array size in function: %zu bytes\n", array_size);
    printf("Element size in function: %zu bytes\n", element_size);
    printf("Array length in function: %zu\n", array_length);
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    print_array_length(arr);

    return 0;
}

在这个例子中,print_array_length 函数接收一个整数数组作为参数。然而,在函数内部,sizeof(arr) 返回的是指针的大小,而不是整个数组的大小。因此,计算得到的数组长度是错误的。

聚好用AI
聚好用AI

可免费AI绘图、AI音乐、AI视频创作,聚集全球顶级AI,一站式创意平台

下载

要解决这个问题,你需要显式地将数组的长度传递给函数:

#include 

void print_array_length(int arr[], size_t length) {
    printf("Array length in function: %zu\n", length);
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    size_t array_length = sizeof(arr) / sizeof(arr[0]);
    print_array_length(arr, array_length);

    return 0;
}

这样,函数就能正确地获取到数组的长度。

sizeof与结构体和联合体的关系

sizeof 在处理结构体和联合体时,会考虑到内存对齐。结构体的大小可能大于其成员大小之和,这是因为编译器可能会在成员之间插入填充字节,以确保每个成员都按照其对齐要求存储。

联合体的大小等于其最大成员的大小。

#include 

struct MyStruct {
    char a;
    int b;
    char c;
};

union MyUnion {
    int a;
    double b;
};

int main() {
    printf("Size of MyStruct: %zu bytes\n", sizeof(struct MyStruct));
    printf("Size of MyUnion: %zu bytes\n", sizeof(union MyUnion));

    return 0;
}

在这个例子中,MyStruct 的大小可能大于 char + int + char 的大小之和,因为编译器可能会为了对齐 int 类型而在 char a 后面插入填充字节。MyUnion 的大小等于 double 的大小,因为 double 是其中最大的成员。

sizeof在动态内存分配中的作用

在动态内存分配中,sizeof 用于确定需要分配的内存大小。例如,在使用 malloc 函数分配内存时,你需要指定要分配的字节数。

#include 
#include 

int main() {
    int *arr = (int *)malloc(5 * sizeof(int)); // 分配5个整数的空间

    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }

    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr); // 释放内存
    return 0;
}

在这个例子中,malloc(5 * sizeof(int)) 分配了可以存储5个整数的内存空间。sizeof(int) 确保分配的内存大小与整数类型的大小相匹配。

使用sizeof进行类型安全编程

sizeof 可以帮助你编写类型安全的代码,尤其是在处理不同数据类型的数组或结构体时。通过使用 sizeof,你可以确保你的代码能够正确地处理不同大小的数据类型,而不会出现内存访问错误。

#include 

int main() {
    int int_array[] = {1, 2, 3, 4, 5};
    float float_array[] = {1.1, 2.2, 3.3, 4.4, 5.5};

    size_t int_length = sizeof(int_array) / sizeof(int_array[0]);
    size_t float_length = sizeof(float_array) / sizeof(float_array[0]);

    printf("Integer array length: %zu\n", int_length);
    printf("Float array length: %zu\n", float_length);

    return 0;
}

这段代码展示了如何使用 sizeof 来计算不同数据类型的数组的长度,从而避免了硬编码数组长度可能导致的错误。

sizeof与可变长数组(VLA)

C99 标准引入了可变长数组(VLA),其大小可以在运行时确定。sizeof 也可以用于 VLA,但在这种情况下,sizeof 的值是在运行时计算的。

#include 

int main() {
    int n;
    printf("Enter the size of the array: ");
    scanf("%d", &n);

    int arr[n]; // 可变长数组

    printf("Size of VLA: %zu bytes\n", sizeof(arr));

    return 0;
}

在这个例子中,数组 arr 的大小是在运行时根据用户输入确定的。sizeof(arr) 返回的是 VLA 在运行时占用的内存大小。

总结

sizeof 运算符是 C 语言中一个非常有用的工具,它可以帮助你确定变量、数据类型和表达式的大小。它在编译时求值,可以用于计算数组长度、动态内存分配和类型安全编程。理解 sizeof 的用法和注意事项对于编写高效、可靠的 C 代码至关重要。尤其需要注意的是,当数组作为参数传递给函数时,它会退化为指针,因此在函数内部使用 sizeof 计算数组长度会得到错误的结果。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

378

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

607

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

348

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

255

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

583

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

518

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

629

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

595

2023.09.22

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 2.5万人学习

Excel 教程
Excel 教程

共162课时 | 9.9万人学习

MongoDB 教程
MongoDB 教程

共17课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号