关于传递参数时,涉及数组的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);**

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值