我如何知道指针指向的特定地址包含哪些内容?我想打印这个地址位置的内容?我应该添加什么作为占位符?如何在C中未知类型时显示参数的值?
回答
任何其他指针类型可以转换为一个空指针,打印其地址:
char c='A';
char *pc=&c;
printf("%p",(void *) pc);
现在,如果你想在这个地址的字符:
char c='A';
char *pc=&c;
printf("%c",*pc);
如果你的问题是 - 你怎么能推断存储在void*
表示的给定位置的对象的类型,那么你不能。如果你的问题是我怎么能知道字节的值我void*
点,那么它是
unsigned char valueAtAddressP = *((unsigned char*)p);
您可以通过多种方式做到这一点
int x = 5;
int *ptrX = 6;
printf("The pointer of x is: %d", &x);
printf("The ptrX is: %d", ptrX);
上述两种方法的给你地址值。
这将只打印引号中的字符串...... – 2010-10-16 18:36:09
无法在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;
另一种方式,你可以做到这一点是指你的数据作为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
。
看起来您正在尝试打印出该地址中的ASCII代码,这并不是问题所在。 – antonio081014 2010-10-16 19:06:33
@ antonio081014:至少对我而言,这并不明显,至少对于什么问题 – 2010-10-16 19:26:01
+1当对象的类型未知时,最好的办法是将值作为十六进制转储打印出来。但是你必须小心不要访问可能超出限制的地址。 – Ziffusion 2010-10-16 19:32:07
- 1. 当在Haskell中进行跟踪时,如何显示一个在编译时其数据类型未知的值?
- 2. 如何在未知的数量和类型参数
- 3. 如何在c中表示time_t类型的未初始化值
- 4. 类型显示为参数值与Url.Action
- 5. C#未知类型
- 6. Kotlin的反思:未知类型参数
- 7. 未知类型的C++
- 8. 基本C++类型何时具有未知初始值?
- 9. 在Go中传递未知参数类型的函数引用
- 10. C#在运行时创建参数类型未知的方法代理
- 11. 创建未知类型的数组。 C#
- 12. 如何显示未知数的RelativeLayouts?
- 13. 调用函数只在C运行时知道参数类型?
- 14. 如何在Android Studio中显示参数类型标签?
- 15. 如何在MessageBox()中显示数值?C++
- 16. 类型设计未知数类型参数
- 17. C++未知类型错误
- 18. 未知类型名称C
- 19. PreparedStatement插入未知数量的值与未知类型
- 20. C++中的未知类型错误
- 21. C++中的OpenCV:“未知类型名称”
- 22. C未知类型名称'数据'
- 23. C++如何深度复制未知数据类型的结构?
- 24. D中允许使用未知类型参数的函数吗?
- 25. 如何在swift中解析未知的json数据类型2
- 26. 使用匿名函数显示为未知类型
- 27. 如何在NHibernate的IQuery参数中设置C#可空值类型值?
- 28. C#中的实时数据值显示
- 29. 如何在C#中显示参考的实际值
- 30. c中的“超载”函数 - 不知道输入参数类型
应将'unsigned char'移植到具有补码或符号/幅度和带符号的plain-'char'类型的病态系统。 (在这些系统上,0x00/0xFF或0x00/0x80之间的区别将通过使用普通的'char'来折叠)。 – 2010-10-16 18:43:58
@R ..编辑。其实我不确定C中是否有无符号字符:) – 2010-10-16 18:46:13