我在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);
}
答案 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
中打印地址(即指针的值)。