gpt4 book ai didi

c - C中的指针问题

转载 作者:行者123 更新时间:2023-12-04 05:34:59 25 4
gpt4 key购买 nike

在此代码中,依赖于 gdb , p0x602010 更改至0x0NULL已分配,(如我所料)

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

int main()
{
int a = 10;

// gdb output
int *p = (int *) malloc(sizeof(int)); // p = (int *) 0x602010
p = NULL; // p = (int *) 0x0
p = &a; // p = p = (int *) 0x7fffffffe15c

return 0;
}

但是,当 pmain() 之外更改在 task() ,我猜它不会更改为 0x0我不知道为什么:
#include<stdio.h>
#include<stdlib.h>

void tast(int *p);

void task(int *p)
{

/*
before
(gdb) p p
$1 = (int *) 0x7fffffffe15c (same as variable a)
(gdb) p &p
$2 = (int **) 0x7fffffffe128
*/

p = NULL;

/*
after
(gdb) p p
$3 = (int *) 0x7fffffffe15c no change?
(gdb) p &p
$4 = (int **) 0x7fffffffe128
*/
}

int main()
{
int a = 10;

// gdb output
int *p = (int *) malloc(sizeof(int)); // p = (int *) 0x602010
p = NULL; // p = (int *) 0x0
p = &a; // p = p = (int *) 0x7fffffffe15c

// it is possible to change what p points to
// after calling task()?
task(p);

// p will be NULL?

return 0;
}

为什么 p 在 task() 中没有变为 0x0?

最佳答案

指针是一个值,如 int .可以这样想:如果你通过了 int进入 task()并将其更改为 task功能会期望它改变吗?不,因为变量是按值传递的。

当您调用 task您正在将值的副本(在本例中为指针)传递给函数。您要做的是更改指针的值,这意味着您需要一个指向存储值的位置的指针。这是一个指向指针的指针,int ** .

反而:

void task(int **p)
{
*p = NULL;
}


task(&p);

传递 p * 的位置.

另一个例子,这次使用 int ,这可能会更清楚。
void makeTen(int *valuePointer)
{
// Change the variable that valuePointer is pointing to.
*valuePointer = 10;
}

void demoFunction()
{
int x = 5;

// x == 5

// Call this with a pointer to the variable X.
// We are passing the memory address of the variable x.
makeTen(&x);

// x == 10

}

如果您理解这一点,请更改 int成为 int *你会明白你原来的问题。

关于c - C中的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com