指针和函数参数

Ven*_*kat 1 c

下面的代码片段给出了输出11 11未定义的值.但是为什么我在第二次执行相同的语句时得到未定义的值?这与函数的范围有什么关系吗?

   void foo(int **const p)
        {
            int j = 11;
            *p = &j;
            printf("%d ", **p);
        }

    int main()
        {
            int i = 10;
            int *p = &i;
            foo(&p);
            printf("%d ", *p);
            printf("%d ", *p);
        return 0;
        }
Run Code Online (Sandbox Code Playgroud)

mat*_*975 6

foo()退出,*p指向一个变量不再存在.因此,您正在调用未定义的行为.

  • @DavidBo这就是重点 - **任何**都可能发生.一旦调用了未定义的行为,就没有关于程序如何表现的规则.这取决于您的实施.主要规则是根本不调用UB. (2认同)

HAL*_*000 5

您指向一个foo函数返回后已经释放的项目.这是一个错误,然后发生未定义的行为.

变量超出范围后,它不会被自动覆盖,它的值只会保留在那里,直到某些其他指令使用该内存位置来存储另一个值.在该示例中,第一个printf的执行会覆盖p指向的内存位置,这就是为什么当您再次读取它时,您会看到其值已更改.

您可以按如下方式修复它:

void foo(int **const p)
{
    int *j = (int *)malloc(sizeof(int));
    *p = j;
    printf("%d ", **p);
}
int main()
{
    int i = 10;
    int *p = &i;
    foo(&p);
    printf("%d ", *p);
    printf("%d ", *p);
    free(p)
    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

它不漂亮,但出于教育目的,它可能是好的.