为啥我得到分段(核心转储)?
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(&num);
替换呼叫。
并将printf("The value of num is %d\n", ptr);
行替换为printf("The value of num is %d\n", *ptr);
。
另外,如果要打印地址,即指针的值,在printf
中将%d
替换为%p
。
【讨论】:
以上是关于为啥我得到分段(核心转储)?的主要内容,如果未能解决你的问题,请参考以下文章