首页 文章

空指针的目的

提问于
浏览
1
  • 平台:Linux 3.2.0 x86(Debian Wheezy)

  • 编译器:GCC 4.7.2(Debian 4.7.2-5)

我在string.h中编写了一些类似于memset(),memcpy()等的函数 . 我使用void指针来避免使函数类型具体 . 但是当我使用char指针取消引用void指针时,我不知道为什么我要求一个void指针 . 在我看来,void指针不做任何事情 . 所以我的问题是void指针有什么作用?举个例子,这是我的一个功能 .

size_t damlocs(size_t sizele, void *val, size_t valsiz, void *ele, size_t elesiz)
{
            //All that 'ele' is used for is this assignment
    char *elebyt = ele;
    char *valbyt = val;
    size_t eleind = 0;
    size_t elebytind = 0;
    size_t valbytind = 0;

    if(elebyt && valbyt)
    {
        while(eleind++ < elesiz)
        {
            elebytind = eleind * sizele;
            valbytind = 0;

            while(elebyt[elebytind++] == valbyt[valbytind++])
                if((valbytind + 1) / sizele == valsiz)
                    return eleind + 1;
        }
    }

    return 0;
}

描述:damlocs()将'ele [0]'中'val'指向的序列定位到'ele [elesiz - 1]'并返回找到序列开头的元素 . 如果未找到序列,则返回零 . 它在概念上与stdlib.h中声明的bsearch()类似,但是使用字节到字节的比较 .

3 回答

  • 1

    在C中,所有对象指针都可以隐式转换为void指针,因此您可以使用 (&x, sizeof x) 轻松地为任何对象 x 调用您的函数 .

    确实,你会使用某种 char 指针来将内存作为一个字节数组来处理,但如果你的函数占用 char * ,你需要在调用站点进行显式转换 .

  • 1

    Void指针另外告诉程序员:

    方法获取指向包含任何内容的内存块的指针

    我们可以使 char* 隐式可转换,但这会造成很多混乱(以及由不那么谨慎的编码器引起的错误) .

  • 5

    如果我理解这一点,那么它基本上就像其他两个答案所说的那样 . 本质上,void指针只生成一个指向内存集的指针,并且可以转换为任何其他类型的指针 .

    基本上,您需要转换为其他指针类型,使指针算法正确地工作以解决分配的内存中的特定数据类型 .

    例如,在您的情况下,您使用如您所述的字符指针:

    char * elebyt = ele; char * valbyt = val;

    所以在这种情况下,当你增加指针I.E.

    eleind

    你要向指针添加1个字节,而不是整数的大小(通常是8个字节)

相关问题