ç赛格故障分配通过功能的阵列时和打印阵列
问题描述:
我觉得像两个代码段都在做同样的事情,但一个赛格故障ç赛格故障分配通过功能的阵列时和打印阵列
代码1:本印刷精美
int main(){
int n = 3;
int i;
int *arr = (int *) malloc(sizeof(int) * n);
int * can_arr;
arr[0] = 3;
arr[1] = 2;
arr[2] = 1;
arr[3] = 2;
can_arr = arr;
for(i = 0; i <= n; i++)
printf("%d ", can_arr[i]);
return 0;
}
代码2:我在打印时出现seg故障
void get_arr(int n, int *arr, int *can_arr){
can_arr = arr;
}
int main(){
int n = 3;
int i;
int *arr = (int *) malloc(sizeof(int) * n);
int * can_arr;
arr[0] = 3;
arr[1] = 2;
arr[2] = 1;
arr[3] = 2;
get_arr(n, arr, can_arr);
for(i = 0; i <= n; i++)
printf("%d ", can_arr[i]);
return 0;
}
为什么?两个都在做can_arr = arr?我正在做我需要这个数组赋值的代码中的其他东西。我在这里简化了它。那么为什么它会出现问题?
答
问题是can_arr
from main
按值传递给函数get_arr
。这意味着行:
can_arr = arr;
在该函数具有局部变量can_arr
被分配一个值的效果。但是这个变量对于函数是本地的。所以它不会影响main
中的can_arr
变量。因此,当您尝试在循环中从can_arr
读取时,can_arr
仍将未初始化。
答
阵列arr
指针在两个实施例已被分配足够的内存3层的元件,与
int n = 3;
int *arr = (int *) malloc(sizeof(int) * n);
// ...
arr[3] = 2;
但是你索引一个第四元件arr[3]
。所以无论出现工作,是靠运气。
而且循环
for(i = 0; i <= n; i++)
不正确,应该是
for(i = 0; i < n; i++)
“代码1:此打印精” - 嗯我不敢苟同。 'arr [3] = ...'全部由它自己调用*未定义的行为。你的数组只有** 3 **元素,每个malloc的大小。因此仅从“0..2”索引。因此,你的代码调用*未定义的行为*,超出这一点的任何东西都是毫无意义的分析。 – WhozCraig