当您传递已经分配的值指针时,会发生什么?

时间:2019-01-05 07:54:20

标签: 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;
}

3 个答案:

答案 0 :(得分:2)

简短的答案是pq是自变量。因此,首先将为p分配与q相同的值,然后由于pmalloc将获得一个新值。 q不能通过函数调用来更改。但是,由于p(和q)未释放而导致内存泄漏。

您可以使用一些印刷品看到它。

#include <stdio.h>
#include <stdlib.h>

void f(int p[]) 
{
    printf("--------------------\n");
    printf("p is now %p\n", (void*)p);
    printf("p points to the value %d\n", p[0]);
    p = (int*)malloc(sizeof(int)); 
    *p = 0; 
    printf("--------------------\n");
    printf("p is now %p\n", (void*)p);
    printf("p points to the value %d\n", p[0]);
    printf("--------------------\n");
}

int main(){
    int *q = 0;
    q = (int*)malloc(sizeof(int));
    *q = 1;
    printf("q is now %p\n", (void*)q);
    printf("q points to the value %d\n", q[0]);
    f(q);
    printf("q is now %p\n", (void*)q);
    printf("q points to the value %d\n", 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

答案 1 :(得分:0)

猜测 的问题是关于问题,这是作业

p = malloc(...)

在功能f中。

这是完全有效的作业,并且与其他作业一样工作。


考虑以下代码:

void f(int p)
{
    p = 0;
}

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

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

要注意的是C语言中的参数是通过值传递的。这意味着参数的值被复制到函数参数变量中(在您的情况下以及在我的示例中为p)。修改副本(即p)当然不会修改原始文件。函数f返回的所有修改都将丢失。

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

答案 2 :(得分:0)

例如,当您要求使用malloc在堆上进行分配时-您必须释放它,如果没有,则会发生内存泄漏-因此,对于这里的2个malloc,您必须使用2个frees。

您需要记住的是,当您向函数发送q时,应按值发送 因此,如果您在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("%d\n", *q); /*now pointer is pointing to the allocationasked for by f */
       free(q); /*free the allocated place on heap */
     }
    return 0;
   }