牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-06-12 投稿人: 浏览次数:1507

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

#include <mem.h>
void test_memset()
{
    printf("set int to 0
");
    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
",i,a[i]);
    }
    printf("--test_memset--
");
    memset(a,0,length);//都设置为0

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

    printf("set char to 0
");
    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
",i,c[i]);
    }
    printf("--memset--
");
    memset(c,0,length);   //0x00 --> a

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

输出:
这里写图片描述

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

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

    return ret;
}

void test_myMemset0()
{
    printf("set int to 0
");
    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
",i,a[i]);
    }

    printf("--test_myMemset0--
");

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

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

    //--------------
    printf("set char to 0
");
    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
",i,c[i]);
    }

    printf("--test_myMemset0--
");

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

    for(i=0;i<5;i++)
    {
        printf("c[%d] = %c
",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--
");
    void* ret = arr;
    int* dest = (int*)arr;   //注意这里的类型转换
    int i = 0;
    for(i=0;i<size;i++)
    {
        dest[i] = v;
        //printf("dest[%d] = %d
",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
",i,a[i]);
    }

    printf("--test_myMemsetNum--
");

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

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

输出:
这里写图片描述

B:针对char数组

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

    printf("--test_myMemsetChar--
");

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

    for(i=0;i<5;i++)
    {
        printf("c[%d] = %c
",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);**

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。