c-当您经过已经分配的值指针时,会发生什么

  • 本文关键字:指针 经过 分配 c pointers malloc
  • 更新时间 :
  • 英文 :


在分配方面会发生什么?使用这样的指针是错误的情况吗?

void f(int p[])
{ 
p = (int*)malloc(sizeof(int));
*p = 0;
}
int main()
{
int *q = 0;
q = (int*)malloc(sizeof(int));
*q = 1;
f(q);
return 0;
}

简单的答案是pq是自变量。因此,首先p将被分配与q相同的值,然后p由于malloc而获得新的值。函数调用不会更改q。但是,由于未释放p(和q),因此存在内存泄漏。

你可以用几张照片看到这一点。

#include <stdio.h>
#include <stdlib.h>
void f(int p[]) 
{
printf("--------------------n");
printf("p is now %pn", (void*)p);
printf("p points to the value %dn", p[0]);
p = (int*)malloc(sizeof(int)); 
*p = 0; 
printf("--------------------n");
printf("p is now %pn", (void*)p);
printf("p points to the value %dn", p[0]);
printf("--------------------n");
}
int main(){
int *q = 0;
q = (int*)malloc(sizeof(int));
*q = 1;
printf("q is now %pn", (void*)q);
printf("q points to the value %dn", q[0]);
f(q);
printf("q is now %pn", (void*)q);
printf("q points to the value %dn", q[0]);
return 0;
}

输出(有一些注释需要解释):

q is now 0x1912010        // In main q is initialized
q points to the value 1   // In main the location q points to is initialized
--------------------
p is now 0x1912010        // In function p first has the same value as q
p points to the value 1   // so it also points to the same as q
--------------------
p is now 0x1913040        // In function p gets a new value due to malloc
p points to the value 0   // and the pointed to memory gets a new value
--------------------
q is now 0x1912010        // Back in main q is the same as before the function call
q points to the value 1   // and the pointed to memory is unchanged as well

猜测你的问题是关于什么的,这是任务

p = malloc(...)

在函数CCD_ 10中。

这是一个完全有效的作业,和其他作业一样有效。


考虑这个代码:

void f(int p)
{
p = 0;
}
int main(void)
{
int q;
q = 1;
f(q);
}

在函数f中,重新分配了变量p,就像您显示的代码中一样。它实际上和您的代码是一样的。p是普通的int变量还是指针变量都无关紧要。您仍然可以根据需要重新分配它。

需要注意的是,C中的参数是通过值传递的。这意味着参数的值被复制到函数参数变量中(在您的例子和我的例子中是p)。修改副本(即p)当然不会修改原始副本。一旦函数f返回,它所做的所有修改都将丢失。

因此,在我的示例中,如果在调用f(q)之后打印q的值,那么它将显示q等于1

例如,每当您使用malloc请求在堆上进行分配时——您必须释放它,如果不释放,则会出现内存泄漏——因此对于这里的2个malloc,您必须使用2个释放。

你需要记住,当你把q发送给函数时,你会把它发送给BY VALUE所以如果你在main中勾选*q,它仍然会保持1。

如果要更改q在函数中指向的值,可以发送f(int**)。

在您的示例中,如果您想更改指针指向的位置并避免内存泄漏,一种方法是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void f(int** p)
{
free(*p); /*first free the initial main allocated memory on heap */
*p = malloc(sizeof(int)); /*now the pointer is pointing to the new allocation */
if(NULL == *p)
{
return;
}
**p = 0;
}
int main(){
int *q = NULL;
q = malloc(sizeof(int)); /*ask for memory allocation */
if(NULL != q)
{
*q = 1;
f(&q); 
printf("%dn", *q); /*now pointer is pointing to the allocationasked for by f */
free(q); /*free the allocated place on heap */
}
return 0;
}

相关内容

  • 没有找到相关文章