C语言中仅做单次解引用时双指针是否必须声明对应数据类型
链表学习中双指针类型声明相关疑问
核心疑问
学习链表相关知识时产生的问题:为什么需要为双指针声明明确的数据类型?
初步理解
- 双指针
dptr是指向指针的指针,对其做一次解引用时,得到的是指向目标数据类型的指针 - 如果仅修改一级指针的值(即修改其存储的内存地址),不需要访问最终指向的结构体等类型的数据;只有对双指针做二次解引用时,才会访问最终指向的目标类型数据
- 二次解引用时必须明确数据类型:
*dptr是指向目标类型的指针,执行**dptr操作时必须知道*dptr指向的数据类型,才能正确完成内存访问 - 延伸疑问:如果代码逻辑确定不会对双指针做二次解引用,是否真的有必要为双指针声明对应的数据类型?
测试代码
#include "stdio.h" #include "stdlib.h" typedef struct Node{ int data; struct Node* next; }Node; void addAtBeg(int**, int); int main(){ int a; Node* head=NULL; printf("Enter data:\n"); scanf("%d",&a); addAtBeg(&head,a); printf("%#x\n",head); printf("%d\n",(*head).data); return 0; } void addAtBeg(int** head, int a){ Node* p; p=(Node *) malloc(sizeof(Node)); p->data=a; p->next=*head; *head=p; }
测试现象与待解答问题
测试时发现,将addAtBeg函数中用于接收主函数传入的&head的形参声明为long long int*类型,程序同样可以正常运行——表面原因是*head = p操作仅读写8字节内存空间,向对应位置写入内存地址即可完成赋值。
待确认问题:上述两种写法(将
Node**类型的形参声明为int**、声明为long long int*)属于未定义行为(UB),还是符合C语言语法规范的合法写法?
内容的提问来源于stack exchange,提问作者Shrihari Hampiholi
相关产品推荐
相关产品推荐

