| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1979 人关注过本帖
标题:关于 void *
只看楼主 加入收藏
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
关于 void *
程序代码:
void *find(const void *first, const void *last, const void *value, size_t size) {
    const char *f = (const char *)first;
    while(f != last) {
        if(!memcmp(f, value, size)) {
            return (void *)f;
        }
        f += size;
    }
    return NULL;
}

有个地方不可以用 C++ 的 template, 所以只能用 void * 实现
对于 const void *value 来说, 传入左值可以运行的很好, 但是右值这个函数就无法正常运作了
是否有方法让这个函数对传入的右值也很好的运作
例如 :
程序代码:
#include <stdio.h>
#include <memory.h>

void *find(const void *first, const void *last, const void *value, size_t size) {
    const char *f = (const char *)first;
    while(f != last) {
        if(!memcmp(f, value, size)) {
            return (void *)f;
        }
        f += size;
    }
    return NULL;
}
int main(int argc, char *argv[]) {
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int value = 2;
    printf("%p", find(a, a + sizeof a / sizeof(int), 2, sizeof value));        //2 为右值, 无法被传入 const void *
}

C 学的不是很好
上面所说的左值和右值是 C++ 中的概念, 此处 C 和 C++ 的概念差别应该不大

[此贴子已经被作者于2018-10-11 22:05编辑过]

搜索更多相关主题的帖子: void const value size int 
2018-10-11 22:02
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:3 
2可能被视作整数了,用(void*)转下试试
2018-10-11 22:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:17 
从你的代码上看,你应该传入 &value,而不是 2
如果你想问的是能不能做到传入2的话,那答案应该是不可能。因为你这个函数还想适用于int之外的类型,除非 void* find(const void* first, const void* last, ... )

2018-10-12 08:49
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:0 
你这个是类型的问题,不是左值右值的问题
2018-10-12 09:47
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
收藏
得分:0 
回复 2楼 吹水佬
2 强转之后就是 0x2
吃个 segment fault
2018-10-12 10:18
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:0 
一定要这样使用只能再写一个函数强转一次
程序代码:
#include <stdio.h>
#include <memory.h>

void *find(const void *first, const void *last, const void *value, size_t size)
{
    const char *f = (const char *)first;
    while(f != last) {
        if(!memcmp(f, value, size)) {
            return (void *)f;
        }
        f += size;
    }
    return NULL;
}

void *find(const void *first, const void *last, int&& value, size_t size)
{
    const void * p = (const void *)&value;
    find(first,last,p,size);
}

int main(int argc, char *argv[])
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int value=2;
    printf("%p", find(a, a + sizeof a / sizeof(int), 2, sizeof(value)));
}

2018-10-12 10:52
快速回复:关于 void *
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019293 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved