为什么我从void **

时间:2017-01-15 09:28:03

标签: c pointers memory-management data-structures

我测试了这段代码:

void foo (void* data[])
{
    static struct structure
    {
        char character;
        int  integer;
    } st1 = *((struct structure *)data);

    printf("[%i][%c]", st1.integer, st1.character);
}

int main (void)
{
    void* *data = calloc(2, sizeof(void* ));
    char  arg1 = 'b';
    int   arg2 = 20;

    data[0] = (char* )&arg1;
    data[1] = (int* ) &arg2;

    foo(data);

    return(0);
}

但是我获得了垃圾值而不是预期的

  

[20] [b]

我尝试了很多东西,包括st1 = *((struct structure *)&data);,(尽管AFAIK data已经是一个地址)声明并初始化单独的结构指针,然后对其进行反演,但没有任何作用。< / p>

这可能是导致这种情况发生的原因,我应该如何正确地接近获得函数参数的相同想法呢?

2 个答案:

答案 0 :(得分:1)

您通常并且可以预期您的结构与两个void*的结构大小相同。

你不能期望结构本身内部有任何特定的填充。而且,当内存区域被重新解释为结构的一部分时,您不能期望将char转换为void*将产生相同的有效char

(我认为我读过的代码)的行为是未定义的。

我最初完全忽略了这样一个事实:你为两个void*分配了地址(想象你将charint自己投射到void*),所以你重新解释了这些价值观根本不会产生你期望的结果。实际上,它可能会导致陷阱值。所以你的代码不当行为。

答案 1 :(得分:-2)

您的问题位于您的结构本身。

data,在主要内容中,您撰写了int*char*。但是,在您的函数中,您定义结构,因为它包含charint,您应该写的是:

void foo (void* data[])
{
    static struct structure
    {
        char* character;
        int*  integer;
    } st1 = *((struct structure *)data);

    printf("[%i][%c]", *(st1.integer), *(st1.character));
}