//C - code
int num
int *pi = # //1
printf(" *pi=%d and pi=%d \n ", *pi, pi); // p1
pi = # //2
printf(" *pi=%d and pi=%d \n ", *pi, pi); // p2
至于评论2
,我知道我们正在为指针pi分配一个有效的地址,但我不明白评论1
行中发生了什么,因为两者都是printf()
语句p1
和p2
正在执行相同的工作。
如果使用 malloc(sizeof(datatype))函数动态内存管理,为什么以下是无效方法?
int *pi;
*pi = (int*)malloc(sizeof(int)); // terminates the program
而以下内容:
int *ri = (int*)malloc(sizeof(int));
和
int *qi;
qi = (int*)malloc(sizeof(int));
工作正常。
请解释一下。
编辑:标记为此问题重复的问题并未讨论我们在动态内存管理过程中遇到的指针和问题。
答案 0 :(得分:2)
您在使用指针中的 *和使用 *作为解除引用操作符时感到困惑。
为了更好地理解,在声明时,您可以将*p
写为(int*) p
。
这意味着,p的类型为'指向int的指针'。
但是,*
也是解除引用运算符,或'value at'运算符。
因此,*pi
= pi处的值,即存储在num位置的值,即num的值。
int *pi;
*pi = (int*)malloc(sizeof(int));
崩溃,因为您尝试将(int*)malloc(sizeof(int))
的结果分配到pi指向的位置。但由于pi没有指向任何地方(它是未初始化的),因此它不起作用。
另一方面,
int *ri = (int*)malloc(sizeof(int));
有效,因为您将ri
指向存储(int*)malloc(sizeof(int));
结果的位置。
int *qi;
qi = (int*)malloc(sizeof(int));
也有效,因为您正在将qi指向存储(int*)malloc(sizeof(int));
的位置。
答案 1 :(得分:1)
你应该明白什么是指针。
指针应该包含有效的内存地址。
int *p;
这里p
是一个保存内存地址的指针,*p
被称为取消引用指针。换句话说,*p
会提供存储在p
位置的值。
所以在动态内存分配期间
int *p = malloc(sizeof(int) );
此处指针p
被分配了malloc()
返回的地址。
int *p;
p = malloc(sizeof(int));
再次指针指向malloc()
返回的值。请注意,我没有使用*p
因为仍没有为指针p
int num;
int *p = #
作业是正确的,但如果你顺从,那么在初始化变量之前你会得到错误的结果。
int num = 10;
int *p = #
现在*p
给出10。
答案 2 :(得分:1)
int *pi;
*pi = (int*)malloc(sizeof(int)); // terminates the program
所以你定义一个指针变量而不初始化它。它现在包含一个未指定的地址。然后,您尝试写到未指定的地址。根据标准,这是未定义的行为,并且您的运行时间足以崩溃,因此您知道存在问题。
int *qi;
qi = (int*)malloc(sizeof(int));
您再次定义一个指针变量,该变量再次包含一个未指定的地址。但是在下一行中,您将分配给变量某些(可能是有效的)地址。所以一切都很好(到目前为止)。
所以你看,两种情况不同。在第一个中,您取消引用指针并分配给该(未指定的地址),然后在第二个指定指针。
答案 3 :(得分:-1)
我最后一次在C中编程是在十多年前,但AFIK,你的第一个例子崩溃,因为你将malloc()的结果分配给* pi(你试图将malloc的结果分配给地址pi目前指向。由于* pi未初始化,这会导致程序崩溃。