C语言的指针和数组的问题

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 vv */
void setArr (int index, int vv){
int i = vv;

 arr[index]=&i;

}
请问为何会输出这个错误结果, 求解答

你给的应该少了全局变量部分,看arr[index] = &i ; 可以知道 arr 是二维数组;或者是一维指针数组,每个元素存放的是int类型变量的地址值。
对于上述程序中,arr[i] 存放的是代码第28行局部变量 i 的地址,当跳出setArr函数时,局部变量i被释放,其地址也就不属于程序内部的地址了。对于高级语言中,访问不属于该程序的地址空间会报段错误,或者说是指针越界。
因此最好改成类似于

int main(int argc, char *argv[])
{
 int temp =-10;
 setArr(0, &temp);
 int temp1 =100;
 setArr(1, &temp1);
.......
}
void setArr (int index, int *vv){
     arr[index]=vv;
}

没看懂你意图。下面我修改过的,看合不合适。
仅供参考!谢谢!

img


#include<stdio.h>

// arr没定义这里加上
int arr[1000];

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));
        //打那么多*号,搞不懂你什么意思
        printf("arr[%d] 值:%d  内存地址:0X%X\n", i, arr[i],&arr[i]);
        
    return 0;
}

/* set arr[index], which is a pointer, to point to an integer of value vv */
void setArr(int index, int vv)
{
    int i = vv;
    // arr[index] = &i;
    // 左边是一个具体的值,右边不能用取地址符号&
    arr[index] = i;
}

int arr[5]; //arr为int数组
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)); 
    return 0;
}

void setArr(int index, int vv)
{
    int i = vv;

    arr[index] = i;
}

如果main不改变,那么需要改变setArr

int *arr[5]; //arr为指针数组
void setArr(int index, int vv)
{
    //int i = vv; 临时变量,函数结束后他的内存地址被释放

    arr[index] = (int *)malloc(sizeof(vv));
    *arr[index] = vv;
}

兄弟,你这个是因为
SetArr内部使用的
int i =vv, 这个i是函数内部局部变量,你取地址后面用这个地址已经失效了,属于作用域失效问题。
可以参考我的专栏C++ 避坑指南系列 - 作用域失效
https://blog.csdn.net/xiaoqiang321/article/details/125690101

也可以看下该专栏其他文章,对你真的有帮助。祝你学习顺利

简单来说就是你设置的元素地址没错,但是函数执行完毕后地址上的数据已经改变了,因为函数参数不在静态区保存,是栈里面的地址,退出后里面内容会变的