【问题标题】:C seg faults when assigning an array through function and printing the array通过函数分配数组并打印数组时出现C seg错误
【发布时间】:2016-09-25 18:27:28
【问题描述】:

我觉得两个代码 sn-ps 正在做同样的事情,但一个 seg 错误

代码 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:打印时此段出错

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?我在我的代码中做其他需要这个数组分配的事情。我只是在这里简化了它。那么为什么会出现段错误呢?

【问题讨论】:

  • "code 1: this prints fine" - 嗯,我不敢苟同。 arr[3] = ... 自己调用未定义的行为。根据 malloc 的大小,您的数组只有 3 个元素宽。因此仅从0..2 索引。因此,您的代码调用了未定义的行为,超出该点的任何内容都无法分析。

标签: c arrays segmentation-fault


【解决方案1】:

问题是main中的can_arr按值传递给函数get_arr。这意味着该行:

can_arr = arr;

在该函数中,局部变量can_arr 被赋值。但是该变量是函数的本地变量。所以不会影响main中的can_arr变量。因此,当您尝试在循环中读取 can_arr 时,can_arr 仍将未初始化。

【讨论】:

    【解决方案2】:

    两个示例中的数组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++)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 2020-08-09
      • 2021-02-16
      • 1970-01-01
      • 2013-10-26
      • 2015-02-08
      • 2020-03-26
      • 2019-06-12
      相关资源
      最近更新 更多