当指向特定类型(例如int, char, float, ..)的指针增加时,其值将按该数据类型的大小增加。如果指向大小为x的数据的空指针被增加,它如何提前x字节指向?编译器如何知道将x添加到指针的值?
当前回答
C标准不允许空指针运算。然而,考虑到void的大小为1,GNU C是允许的。
C11标准§6.2.5
第19段
void类型由一组空值组成;这是一个不完整的 无法完成的对象类型。
以下程序在GCC编译器中工作良好。
#include<stdio.h>
int main()
{
int arr[2] = {1, 2};
void *ptr = &arr;
ptr = ptr + sizeof(int);
printf("%d\n", *(int *)ptr);
return 0;
}
可能是其他编译器产生错误。
其他回答
在进行指针算术之前,必须将它强制转换为另一种类型的指针。
不允许对void*指针进行指针算术运算。
你不能在void *类型上做指针算术,正是因为这个原因!
C标准不允许空指针运算。然而,考虑到void的大小为1,GNU C是允许的。
C11标准§6.2.5
第19段
void类型由一组空值组成;这是一个不完整的 无法完成的对象类型。
以下程序在GCC编译器中工作良好。
#include<stdio.h>
int main()
{
int arr[2] = {1, 2};
void *ptr = &arr;
ptr = ptr + sizeof(int);
printf("%d\n", *(int *)ptr);
return 0;
}
可能是其他编译器产生错误。
Void指针可以指向任何内存块。因此,当我们尝试对空指针进行指针算术时,编译器不知道要增加/减少多少字节。因此,必须首先将void指针类型转换为已知类型,然后才能将它们涉及到任何指针算术。
void *p = malloc(sizeof(char)*10);
p++; //compiler does how many where to pint the pointer after this increment operation
char * c = (char *)p;
c++; // compiler will increment the c by 1, since size of char is 1 byte.
推荐文章
- c++中size_t和int的区别是什么?
- 在C和c++中静态变量存储在哪里?
- errno线程安全吗?
- 如何在C程序中获取当前目录?
- 互斥实例/教程?
- 如何添加一个'或'条件在#ifdef
- extern关键字对C函数的影响
- 如果使用if-return-return或if-else-return?
- 转换Python程序到C/ c++代码?
- 为什么程序不是经常用汇编编写的?
- 有没有替换Windows (Visual C)的unistd.h ?
- 使用gcc命令行从.c文件构建.so文件
- C多行宏:do/while(0) vs作用域块
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?