是否可以在没有特定数据类型的情况下在C中创建指针

时间:2017-08-15 08:20:11

标签: c pointers memory types low-level

所以我开始了一个编程项目,我发现如果我只能制作一个指针而不将其声明为char*int*等等,那么它会让一切变得更容易,只需在某处指定大小其他。我四处搜寻但找不到任何有用的东西。

现在我的想法是将所有内容都设为char*,并将它们与位移和/或操作联合起来(如果它不是字符串)。如果这对C来说太低了,我用什么语言来做这个,我宁愿不使用汇编,因为它不够平台。

修改 所以我忘记提到它应该在运行时分配内存,并且不要浪费太多内存我想根据大小分配内存。 例如,我想为char大小的值分配1个字节,为int大小的值分配2个字节,依此类推。大小是在文件中预定义的,但在读取文件之前是不知道的,应该在运行时读取而不是编译时间。

2 个答案:

答案 0 :(得分:10)

C中有一个通用指针类型,原因如下:void *

您可以隐式地将任何数据指针类型转换为void *

char foo[] = "bar";
void *ptr = foo;

// ...

char *str = ptr;

但请注意,您仍需要知道正确的类型。通过错误类型的指针访问对象将是未定义的行为

使用void *无法做到两件事:

  • 你不能在它上面做指针算术(这包括索引)。 void不完整类型,因此它没有已知的大小。一些编译器通过假设void *的大小允许char上的算术,但这是一个扩展,不可移植

  • 您无法取消引用void *void“没有”,所以没有意义。

答案 1 :(得分:1)

我认为对数据类型存在一些误解,以及编译时数据类型和运行时数据类型是什么。首先是C#的一个例子,它是一种编程语言,编译时数据类型和运行时数据类型之间的区别很重要。在C#中,您可以编写类似

的内容
IEnumerable<int> myEnumerable = new List<int>();

此处,myEnumerable对象具有编译时数据类型IEnumerable<int>和运行时数据类型List<int>

但是,在C编程语言中,没有相关的概念,因为C没有这么强的类型系统。本质上,在C编程语言中,存储在变量中的所有信息都是二进制数据,存储在进程的虚拟内存中。此数据没有分配类型信息。因此,您无法通过查看数据来重建数据类型。在C编程语言中,您可以将数据转换为您喜欢的任何数据类型。

正如其他用户已经提到的,如果您不知道数据的具体类型,则可以使用void