#include <stdio.h>
int main(void)
{
int a;
int *ptr_a,*ptr_ptr_a;
int **ptr;
a=0;
ptr_a = &a;
ptr_ptr_a = (int*)&ptr_a;
ptr = &ptr_a;
// 给A赋值有两种方式:
**ptr = 1;
// 或
*(int*)*ptr_ptr_a = 1;
printf("%d",a);
return 0;
}
如上程序,其中
**ptr
和
*(int*)*ptr_ptr_a
的作用是相等的吗?
想请问一下这样子有什么弊端?(除开语法上写着麻烦,会不会造成bug?)
不相等。
从内部储存的角度考虑的话,我觉得是会出bug的。
首先,对于c程序中,内存地址的长度都是一致的,所以用
int*
和int**
储存地址是不会出现数据溢出的问题,都是用一个long
的大小储存地址的。(其中32位系统大小为4byte,64位系统为8byte)其次,对于一个指针所指向的内存程序将会根据指针的类型决定从地址起始处开始读几个byte,如果是一个
int*
的指针那么将会读入一个int
的大小即4byte,如果是一个int**
那么将会读入一个long
的大小(4byte或者8byte),所以如果题主想要用ptr_ptr_a来修改a值的话我们来看一下,第一步解引用*ptr_ptr_a的话,由于ptr_ptr_a是一个int*
的指针所以程序从ptr_ptr_a处读入一个int
的大小,好了,到这为止对于64位的系统的朋友们就可能会出bug了,因为他们的地址长度是8个byte,有4个byte被截断了,32位的系统应该没事,因为他们的地址大小就是4个byte,所以对于第一步解引用就会可能会出现bug。如果题主还是要折腾的话那应该这样写:其实这样的话也就和`int**`没差啦?
以及那个**ptr题主写的是没问题的~