指针和函数参数

时间:2014-01-02 09:43:49

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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;
 }

它并不漂亮,但出于教育目的,它可能会很好。