如果在C中未知类型,如何打印参数的值?

时间:2010-10-16 18:29:05

标签: c pointers

我如何知道指针指向的特定地址是什么?我想在这个地址位置打印内容?我应该添加什么作为占位符?

5 个答案:

答案 0 :(得分:3)

如果您的问题是 - 如何推断出由void*表示的给定位置存储的对象的类型,那么您不能。如果你的问题是如何知道我的void*指向的字节的值,那么它是

unsigned char valueAtAddressP = *((unsigned char*)p);

答案 1 :(得分:3)

无法在C中检测到它。您的应用程序应将指针指向的数据视为特定类型 - 取决于您的需求。

void treat_as_char(const void* ptr)
{
    const char *p = ptr;
    printf("Data: %s\n", p);
}

void treat_as_int(const void* ptr)
{
    const int *p = ptr;
    printf("Data (int): %d\n", p);
}

您需要一些自定义结构来为特定指针允许各种类型:

typedef struct _Variant
{
    enum {INT, CHAR, DOUBLE} type;
    void *ptr;
} Variant;

答案 2 :(得分:2)

任何其他指针类型都可以强制转换为void指针以打印其地址:

char c='A';
char *pc=&c;

printf("%p",(void *) pc);

现在,如果你想要这个地址的角色:

char c='A';
char *pc=&c;

printf("%c",*pc);

答案 3 :(得分:2)

另一种方法是将您的数据称为void*,然后将其称为unsigned char*,并将所有内容打印为十六进制字节。我发现当必须处理其使用尚不清楚的连续字节时,它确实非常有用。

但是,这种方法要求您能够知道数据的时长,因为无法在任意类型的数据上调用sizeof

#include <stdio.h>

int main() {
    char name[16] = "hello there";
    void* voidBuffer = name;

    unsigned char* buffer = voidBuffer;
    int i;
    for (i=0; i<16; i++) {
        printf("%x ", (unsigned int)buffer[i]);
    }

    return 0;
}

这将输出68 65 6c 6c 6f 20 74 68 65 72 65 0 0 0 0 0

答案 4 :(得分:1)

您可以通过多种方式实现

int x = 5;
int *ptrX = 6;
printf("The pointer of x is: %d", &x);
printf("The ptrX is: %d", ptrX);

上述两种方法都为您提供了地址值。