ç赛格故障分配通过功能的阵列时和打印阵列

问题描述:

我觉得像两个代码段都在做同样的事情,但一个赛格故障ç赛格故障分配通过功能的阵列时和打印阵列

代码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?我正在做我需要这个数组赋值的代码中的其他东西。我在这里简化了它。那么为什么它会出现问题?

+0

“代码1:此打印精” - 嗯我不敢苟同。 'arr [3] = ...'全部由它自己调用*未定义的行为。你的数组只有** 3 **元素,每个malloc的大小。因此仅从“0..2”索引。因此,你的代码调用*未定义的行为*,超出这一点的任何东西都是毫无意义的分析。 – WhozCraig

问题是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++)