Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 取消引用指向void数组的指针_C_Arrays_Pointers_Void_Dereference - Fatal编程技术网

C 取消引用指向void数组的指针

C 取消引用指向void数组的指针,c,arrays,pointers,void,dereference,C,Arrays,Pointers,Void,Dereference,我试图了解更多关于C及其神秘的隐藏能力的知识,并试图制作一个样本结构,其中包含一个指向空的指针,用作数组。 编辑:重要提示:这是针对原始C代码的 假设我有这个结构 typedef struct mystruct { unsigned char foo; unsigned int max; enum data_t type; void* data; } mystruct; 我想让数据最多包含数据枚举包含的无符号字符

我试图了解更多关于C及其神秘的隐藏能力的知识,并试图制作一个样本结构,其中包含一个指向空的指针,用作数组。 编辑:重要提示:这是针对原始C代码的

假设我有这个结构

    typedef struct mystruct {
        unsigned char foo;
        unsigned int max;
        enum data_t type;
        void* data;

    } mystruct;
我想让数据最多包含数据枚举包含的无符号字符、无符号短整数和无符号长整数 这3种情况下的值

    enum Grid_t {gi8, gi16, gi32}; //For 8, 16 and 32 bit uints.
然后我有一个函数,它初始化并分配一个结构,并且应该返回一个指向新结构的指针

    mystruct* new(unsigned char foo, unsigned int bar, long value) {
        mystruct* new;
        new = malloc(sizeof(mystruct)); //Allocate space for the struct.
        assert(new != NULL);
        new->foo = foo;
        new->max = bar;
        int i;
        switch(type){
            case gi8: default:
                new->data = (unsigned char *)calloc(new->max, sizeof(unsigned char));
                assert(new->data != NULL);
                for(i = 0; i < new->max; i++){
                    *((unsigned char*)new->data + i) = (unsigned char)value;
                    //Can I do anything with the format new->data[n]? I can't seem
                    //to use the [] shortcut to point to members in this case!
                }
            break;
        }
        return new;
    }
mystruct*new(无符号字符foo、无符号整型条、长值){
mystruct*新;
new=malloc(sizeof(mystruct));//为结构分配空间。
断言(新!=NULL);
新建->foo=foo;
新建->最大值=条;
int i;
开关(类型){
案例8:违约:
新建->数据=(无符号字符*)calloc(新建->最大值,sizeof(无符号字符));
断言(新建->数据!=NULL);
对于(i=0;imax;i++){
*((无符号字符*)新建->数据+i)=(无符号字符)值;
//我能用格式new->data[n]做些什么吗?我似乎做不到
//在这种情况下,使用[]快捷方式指向成员!
}
打破
}
归还新的;
}
编译器没有返回任何警告,但是我不太确定这个方法。使用指针是否合法

有没有更好的办法

我没打电话。像mystruct*P;P=新的(0,501024)


工会很有趣,但不是我想要的。因为我无论如何都要单独处理每一个具体案例,所以演员阵容看起来就像一个联盟一样好。我特别想要比32位阵列大得多的8位阵列,所以联合似乎没有帮助。为此,我将它设为一个长数组:P

类型是否应该是函数的参数?(不要命名此函数或任何变量<代码>新< /COD>或任何试图使用它的C++程序员将追捕您)

如果要使用数组索引,可以使用如下临时指针:

unsigned char *cdata = (unsigned char *)new->data;
cdata[i] = value;
我认为你的方法没有什么问题。如果您需要一个特定的大小(我想您确实给出了名称
gi8
等),我建议包括
stdint.h
,并使用typedefs
uint8\u t
uint16\u t
,以及
uint32\u t
,那又如何呢

typedef struct mystruct 
{
    unsigned char foo;
    unsigned int max;
    enum data_t type;
    union
    {
        unsigned char *chars;
        unsigned short *shortints;
        unsigned long *longints; 
    };
} mystruct;

那样的话,根本就没有必要投。只需使用
data\u t
确定要访问哪些指针。

指针只是内存空间中的地址。你可以随心所欲地解释它。查看
union
,了解有关如何以多种方式解释同一内存位置的更多信息


在C和C++中指针类型之间的转换是常见的,并且使用VULL意味着不希望用户意外地引用引用(撤销空格*将导致错误,但是在向int *抛出相同的指针时将不会)

< P>不,您不能取消引用<代码> Value*/Cux>指针,这是C语言标准所禁止的。在执行此操作之前,必须将其转换为具体的指针类型

或者,根据您的需要,您也可以在结构中使用
联合
,而不是
无效*

typedef struct mystruct {
    unsigned char foo;
    unsigned int max;
    enum data_t type;
    union {
        unsigned char *uc;
        unsigned short *us;
        unsigned int *ui;
    } data;
} mystruct;

在任何给定时间,只有
data.uc
data.us
data.ui
中的一个有效,因为它们在内存中占用相同的空间。然后,您可以使用适当的成员访问数据数组,而不必从
void*

强制转换。要回答注释中的问题,您不能使用[],因为取消引用void指针是非法的。如果你使用一个空指针,那么你需要在每一个解引用周围使用switch语句,这样你就可以在运行时将指针转换为正确的类型。实际上,这是我的意图。你的代码只是C99,而不是“原始C”。“原始C”是C89。您的代码不工作,在“开关(类型)”中,“类型”未定义。@user4在文章中进行模拟时,这是一个输入错误,而不是在实际代码中。很抱歉,我在编辑发布功能时忽略了这一点。类型实际上是完整代码段中的一个参数,我的错!我了解了临时指针,我可能会喜欢使用这种方法(在IMO中使强制转换更具可读性)。作为记录,有没有办法使用foo->bar[0]语法?正如其他海报所写的那样,
union
可以做到这一点。您可以使用
ptr\u to\u mystruct->chars[max-1]
是的,这也可以。很危险,但是C假设你知道你在做什么。我读了一些关于联合的文章……它使用的内存是否与较大的元素(long)或分配给最大的元素的内存一样多?(所以,如果我指定255,它在内存中的存储时间算不算长?)。(我假设是前者,但以防万一)@roger在这种情况下,它们的大小都相同,因为它们是指针,但一般来说,是的,联合占用的空间与它们最大的成员一样多。@roger\u rales:它使用最大指针的大小。通常,指针的大小都相同。当然对齐也有一定的作用,但它们的对齐方式可能相同。@mkb:可能不会比铸造更危险。在这里,编译器还假设您知道自己在做什么