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;
}
没看懂你意图。下面我修改过的,看合不合适。
仅供参考!谢谢!
#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
也可以看下该专栏其他文章,对你真的有帮助。祝你学习顺利
简单来说就是你设置的元素地址没错,但是函数执行完毕后地址上的数据已经改变了,因为函数参数不在静态区保存,是栈里面的地址,退出后里面内容会变的