-1

我对取消引用我编写了一个简单代码的指针有疑问,但我不知道它在某些情况下失败的原因,有人可以告诉它失败的原因是什么。如果我们有 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

4 回答 4

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 解释器特别有用。

于 2013-03-20T07:14:19.157 回答
1

当你这样做

int *ptr = 10;

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

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

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

类似的double指针。

于 2013-03-20T07:13:31.780 回答
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]

注意:-请从网上参考,一个程序(进程)将创建多少个段?[一般来说,堆段、栈段、数据段和文本段]

于 2013-03-20T07:32:09.123 回答
0

原因char *ptr = "stack overflow"有效而int *ptr = 10无效,这10只是数字 10,但"stack overflow"计算结果为指向字符的指针。

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

于 2013-03-20T10:07:44.993 回答