关于传递参数时,涉及数组的length = sizeof(a)/sizeof(int)还是为length = sizeof(a)的总结

1.以memset函数举例说明吧!

#include <mem.h>
void test_memset()
{
    printf("set int to 0\n");
    int a[] = {1,2,3,4,5};
    //int length = sizeof(a)/sizeof(int);//不能使用sizeof(c)/sizeof(int)
    int length = sizeof(a);
    int i = 0;

    for(i=0;i<5;i++)
    {
        printf("a[%d] = %d\n",i,a[i]);
    }
    printf("--test_memset--\n");
    memset(a,0,length);//都设置为0

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

    printf("set char to 0\n");
    char c[] = {'1','2','3','4','5'};
    //int length = sizeof(c)/sizeof(int);//不能使用sizeof(c)/sizeof(int)
    length = sizeof(c);

    for(i=0;i<5;i++)
    {
        printf("c[%d] = %c\n",i,c[i]);
    }
    printf("--memset--\n");
    memset(c,0,length);   //0x00 --> a

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

输出:
这里写图片描述

我自己写的memset函数,函数原型为:void* myMemset0(void* arr,char v,unsigned int size);

void* myMemset0(void* arr,char v,unsigned int size)
{
    printf("--myMemset0--\n");
    void* ret = arr;
    char* dest = (char*)arr;
    int i = 0;
    for(i=0;i<size;i++)
    {
        dest[i] = v;
        //printf("dest[%d] = %d\n",i,dest[i]);
    }

    return ret;
}

void test_myMemset0()
{
    printf("set int to 0\n");
    int a[] = {1,2,3,4,5};
    //int length = sizeof(a)/sizeof(int);
    int length = sizeof(a);
    int i = 0;

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

    printf("--test_myMemset0--\n");

    myMemset0(a,0,length);//都设置为0

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

    //--------------
    printf("set char to 0\n");
    char c[] = {'1','2','3','4','5'};
    //length = sizeof(a)/sizeof(int);
    length = sizeof(c);


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

    printf("--test_myMemset0--\n");

    myMemset0(c,0,length);//都设置为0

    for(i=0;i<5;i++)
    {
        printf("c[%d] = %c\n",i,c[i]);  //0x00 --> a
    }
}

输出:
这里写图片描述

发现结果是一模一样的,也就是说,当使用memset函数,对数组(连续的内存区域)进行写0操作时,使用length = sizeof(c);而不能使用length = sizeof(a)/sizeof(int);

如果使用memset函数,对数组(连续的内存区域)进行写非零的数值时,如memset(a,1,length);发现输出数组的结果并不是我们想要的。
原因有两个:
1>由于memset中传进的length可能是length = sizeof(c);而不是length = sizeof(a)/sizeof(int);
2>memset中,char* dest = (char*)arr;(以我自定义的函数myMemset0为例),强制转化的类型不一致造成的,这个是最主要的。

因此想要对数组(连续的内存区域)进行写非零的数值时,需要改写memset函数,并且,对char数组的使用和对int数组的使用是不同,因为函数内部的类型因char或int不一样而有所改动。
A: 针对int数组

#include <stdio.h>
#include <mem.h>

void* myMemsetNum(void* arr,int v,unsigned int size)
{
    printf("--myMemsetNum--\n");
    void* ret = arr;
    int* dest = (int*)arr;   //注意这里的类型转换
    int i = 0;
    for(i=0;i<size;i++)
    {
        dest[i] = v;
        //printf("dest[%d] = %d\n",i,dest[i]);
    }

    return ret;
}
void test_myMemsetNum()
{
    int a[] = {1,2,3,4,5};  //
    int length = sizeof(a)/sizeof(int);
    //int length = sizeof(a);
    int i = 0;

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

    printf("--test_myMemsetNum--\n");

    myMemsetNum(a,7,length);  //都设置为7

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

输出:
这里写图片描述

B:针对char数组

void* myMemsetChar(void* arr,char v,unsigned int size)
{
    printf("--myMemsetChar--\n");
    void* ret = arr;
    char* dest = (char*)arr;  //注意这里的类型转换
    int i = 0;
    for(i=0;i<size;i++)
    {
        dest[i] = v;
//        printf("dest[%d] = %c\n",i,dest[i]);
    }

    return ret;
}
void test_myMemsetChar()
{
    char c[] = {'a','b','c','d','e'};
    int length = sizeof(c)/sizeof(char);
    //int length = sizeof(c);
    int i = 0;

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

    printf("--test_myMemsetChar--\n");

    myMemsetChar(c,'x',length);//都设置为'x'

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

输出:
这里写图片描述

注意
1>由于函数中传进的length是sizeof(a)/sizeof(int);而不是length = sizeof(c);
2>函数中要进行类型转换,不同的类型的数组,强制转换的类型不同,int* dest = (int*)arr;,char* dest = (char*)arr;(以我自定义的函数为例)。

总结:
**对连续内存操作时,就使用length = sizeof(c);
对数组进行操作时,就使用length = sizeof(a)/sizeof(int);**

### 使用 `sizeof` 计算数组长度的方法 在 C 语言中,可以通过 `sizeof` 运算符计算数组的长度。具体方法是将数组整体所占的字节数除以单个元素所占的字节数,从而得到元素个数。例如,对于一个整型数组 `arr`,其长度可以表示为: ```c int arr[] = {10, 20, 30, 40, 50}; int length = sizeof(arr) / sizeof(arr[0]); ``` 其中,`sizeof(arr)` 返回整个数组所占的字节数,而 `sizeof(arr[0])` 返回单个元素所占的字节数。通过除法运算,即可得到数组中元素的总数[^1]。 ### 示例代码 以下是一个完整的示例,展示如何使用 `sizeof` 计算数组长度并遍历数组: ```c #include <stdio.h> int main() { int arr[] = {10, 20, 30, 40, 50}; int length = sizeof(arr) / sizeof(arr[0]); printf("数组长度为:%d\n", length); for (int i = 0; i < length; i++) { printf("arr[%d] = %d\n", i, arr[i]); } return 0; } ``` 程序输出如下: ``` 数组长度为:5 arr[0] = 10 arr[1] = 20 arr[2] = 30 arr[3] = 40 arr[4] = 50 ``` ### 注意事项 当数组作为参数传递给函数数组名会退化为指针,此 `sizeof(arr)` 将返回指针的大小,而不是整个数组的大小。例如: ```c void printLength(int arr[]) { int length = sizeof(arr) / sizeof(arr[0]); printf("长度是:%d\n", length); // 输出 1 或 2,取决于系统架构 } ``` 在这种情况下,`sizeof(arr)` 返回的是指针的大小(例如在 32 位系统中为 4 字节,在 64 位系统中为 8 字节),而不是数组整体的大小,因此无法正确计算数组长度[^3]。 ### 总结 `sizeof` 是一种在函数内部或数组定义范围内计算数组长度的有效方式,但其仅适用于数组定义的作用域内。若数组作为参数传递给函数,则无法使用 `sizeof` 直接计算其长度。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值