为啥我得到分段(核心转储)?

Posted

技术标签:

【中文标题】为啥我得到分段(核心转储)?【英文标题】:Why am I getting segmentation (core dump)?为什么我得到分段(核心转储)? 【发布时间】:2014-03-04 23:56:45 【问题描述】:

我在 youtube 上做了一个练习,最终得到了与他相同的解决方案,但他的代码能够获取指针指向的地址,但是当我编译并运行它时,我得到一个错误分段错误(核心转储),我是否以某种方式访问​​了我不应该访问的内存?为什么他的代码能够运行而我的代码却不能? 我知道问题出在 printf("The address of num is %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);
  

【问题讨论】:

编译程序并打开警告以识别此问题 【参考方案1】:

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 处的值。但是您不能访问任意地址处的值,除非您很幸运并且操作系统将这个值完全提供给了进程。

【讨论】:

谢谢你的解释,现在很有意义。 XD 谢谢!【参考方案2】:

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

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

【讨论】:

是的,但是我看不到 print_int_ptr 的参数是怎么错的?我试图解决的问题是,创建一个名为 print_int_ptr 的函数,它接受一个参数,一个指向整数的指针并打印出整数及其地址。 好吧,然后你的 num=10;语句尝试将下一行更改为 print_int_ptr(&num);把num的地址传给函数,这样就可以赋值给下面print_int_ptr函数中声明的ptr u 因为现在你正在输入你想要的整数作为参数并将它分配给你的 ptr 的地址【参考方案3】:

您的函数正在使用指针int *

所以用print_int_ptr(&amp;num);替换呼叫。

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

另外,如果要打印地址,即指针的值,在printf 中将%d 替换为%p

【讨论】:

以上是关于为啥我得到分段(核心转储)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 C 中收到警告“分段错误,核心转储”

为啥我的代码会出现分段/核心转储错误?

为啥我的代码中出现分段错误(核心转储)错误?

为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]

命令行参数分段错误(核心转储)

分段错误(核心转储)