我为什么要进行细分(核心转储)?

时间:2014-03-04 23:56:45

标签: c pointers segmentation-fault coredump

我在youtube上做了一个练习,我最终得到了他所拥有的相同解决方案,但他的代码能够获得指针所指向的地址,但是当我编译并运行它时,我得到错误分段错误(核心转储),我以某种方式访问​​我不应该访问的内存?他的代码是如何运行的,但我的代码却没有? 我知道问题在于printf(“num的地址是%d \ n”,* ptr);但是这条线在youtube上运行,但在我的编译器上没有。

#include <stdio.h>

 int print_int_ptr();

 int main(){
   int num;

   num = 10;
   print_int_ptr(num);


   return(0);
 }
 /* dont forget that in between the assignment of ptr = &num */

 /* Take the address of an integer as a parameter, and print out both the
  * address and the integer itself
  */
  void print_int_ptr(int *ptr){

    printf("The address of num is %d\n", *ptr);
    printf("The value of num is %d\n", ptr);
  }

3 个答案:

答案 0 :(得分:2)

main()中,num是一个整数。您将其传递给print_int_ptr(int *ptr)

int *ptr表示print_int_ptr()的第一个参数是一个指针,因为int *声明了一个指针。因此,只要输入print_int_ptr(),ptr就会被视为指针。但是num = 10,所以对ptr的任何引用都会指出地址10,这显然是不对的。

这正是您使用printf("The address of num is %d\n", *ptr);所做的。 *ptr取消引用指针,它尝试访问地址10处的值。但是你不能访问任意地址的值,除非你很幸运并且操作系统给出了这个过程。

答案 1 :(得分:1)

您将num声明为整数,并将其作为参数放在print_int_ptr函数中。我想当你声明print_int_ptr函数时,你错误地声明了它。它应该是一个int而不是一个ptr?

如果你没有返回任何值,你应该将print_int_ptr函数声明为void而不是int。

答案 2 :(得分:0)

您的功能正在使用指针int *

所以请用print_int_ptr(&num);替换来电。

并将printf("The value of num is %d\n", ptr);行替换为printf("The value of num is %d\n", *ptr);

此外,如果您想在printf替换%d %p中打印地址(即指针的值)。