C 程序打印意外输出

约瑟夫

我有以下 C 程序:

#include <stdio.h>

void setArr(int, int);

int *arr[10]; // array of 10 int pointers

int main(int argc, char *argv[])
{
    int i;

    setArr(0, -10);
    setArr(1, 100);
    setArr(2, 200);
    setArr(3, 300);
    setArr(4, 400);

    for (i = 0; i < 5; i++)
        printf("arr[%d] -*-> %d %d\n", i, *arr[i], **(arr + i)); /* should be -10,100, 200,300,400 */
    return 0;
}

/* set arr[index], which is a pointer, to point to an integer of value v */
void setArr(int index, int v)
{
    int i = v;
    arr[index] = &i;
}

它提供以下输出:

arr[0] -*-> 400 400
arr[1] -*-> 400 400
arr[2] -*-> 400 400
arr[3] -*-> 400 400
arr[4] -*-> 400 400

我的理解是,中的每个元素arr都是一个指针,它将指向i在函数内部创建的变量的位置

我不确定它如何始终始终返回 400
出现此输出的原因可能是什么以及如何纠正它?

埃里克·波斯皮希尔

int i = v;函数内的定义自动为 保留内存i当函数执行结束时,内存预留被释放。

一旦内存预留被释放,C 标准不保证任何指向内存的指针的值,您不应使用这些值。

每次调用时setArr,都会保留内存然后释放。一个常见的结果是使用相同的内存作为保留、释放、保留、释放等,并且指针似乎指向相同的位置。然后,您已将 的每个元素都设置arr为指向同一位置。但是,编译器的优化和其他操作可能会产生其他行为。

当然,该位置一次只能保存一个值,因此在调用 之后在其中只能看到一个值setArr

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章