指针和取消引用它的方法

时间:2013-03-20 07:11:27

标签: c pointers

我对取消引用指针有疑问 我写了一个简单的代码,但我不知道它在某种情况下失败的原因是否有人可以告诉它失败的原因是什么。如果我们有char *ptr = "stack overflow",那么编译器本身将为其分配内存。

int main()
{
   int *ptr = 10;
   double *dptr = 111.111
   printf("%d", *ptr); //will give segmentation violation as we are trying to access the content in location 10
   printf("%d", ptr);//o/p will be 10 
   printf("%lf", dptr); // will give segmentation violation 
   printf("%lf", *dptr); // will give segmentation violation

}

4 个答案:

答案 0 :(得分:3)

int *ptr = 10;
double *dptr = 111.111

问题在于以上两行。

ptr指向地址10dptr我不知道它指向的位置。

取消引用这些指针肯定会产生未定义的行为..通常是分段违规错误。

修正:

int main(){
   int iVal = 10; 
   double dVal = 111.11;

   int *ptr = &iVal;
   double *dptr = &dval;

   printf("%d", *ptr); // ok
   printf("%p", (void *)ptr);// ok
   printf("%p", (void *)dptr); // ok
   printf("%lf", *dptr); // ok
   return 0;
}

理论:指针是一个保存地址的变量 - 或者正如Alexey Frunze所说:

  

C标准没有定义指针在内部的含义以及指针的含义   内部工作。这是故意的,以便不限制数量   平台,其中C可以实现为编译或解释   语言。

     

指针值可以是某种ID或句柄或其组合   几个ID(对x86段和偏移问好)但不是   必然是一个真实的内存地址这个ID可以是任何东西,甚至是   固定大小的文本字符串。非地址表示可能是特别的   对C语言翻译很有用。

答案 1 :(得分:1)

当你这样做时

int *ptr = 10;

您告诉编译器ptr是指向地址的指针 10.取消引用此地址将导致未定义的行为并可能导致崩溃。

你很可能想要这样的东西:

int ival = 10;
int *ptr = &ival;

类似于double指针。

答案 2 :(得分:0)

char * ptr =“堆栈溢出”

  This buffer was allocated in TEXT SEGMENT hence there is no issue of dereferencing and getting the address but if you modify the data content its a voilation [Segmentation Fault]

注意: - 请在线参考,为程序(流程)创建多少个细分? [通常,堆段,堆栈段,数据段&文字段]

答案 3 :(得分:0)

char *ptr = "stack overflow"的工作原因和int *ptr = 10的原因不在于10只是数字10,但是"stack overflow"会计算出指向字符的指针。

字符串文字是特殊种类的常量。编译器将字符串的字符放在内存中,字符串文字的值是指向这些字符的指针。相反,整数和浮点常数只是它们的值;他们不是指针。