为什么这个简单的C示例以段错误结束?

时间:2013-02-14 00:24:50

标签: c segmentation-fault

以下简单示例在尝试访问mmain的第一个元素时导致分段错误。

为什么会这样?

如何修复它,但仍然保持代码的整体结构相同?

感谢。

#include <stdio.h>
#include <stdlib.h>

double *array(int cols) {
  return malloc(cols*sizeof(double));
}

void create_and_modify_array(double *m) {
  m = array(10);
  m[0] = 123;
}

void main() {
  double *m;
  create_and_modify_array(m);
  printf("%f\n", m[0]);
}

3 个答案:

答案 0 :(得分:6)

这里的问题是C总是按值传递。按值传递意味着函数参数是调用它们的变量的副本。这意味着当你这样做时:

m = array(10);

create_and_modify_array(double *m)内,您只会更改函数的m点的本地副本。来自main方法的m指针不受影响(并保持未初始化,因此崩溃)。

要解决此问题,您可以将指针传递给main()的{​​{1}}指针:

m

并将void create_and_modify_array(double **m) { *m = array(10); // change the pointer that `m` points to (*m)[0] = 123; // assign something to the first element of what `m` points to } &#39; s main()的地址传递给:

m

答案 1 :(得分:2)

因为create_and_modify_array中创建的指针与main()中声明和使用的地址不同。你可以这样做

double *create_and_modify_array(double *m) {
  m = array(10);
  m[0] = 123;
  return m;
}

void main() {
  double *m = create_and_modify_array(m);
  printf("%f\n", m[0]);
  free (m);
}

答案 2 :(得分:1)

它是段错误,因为create_and_modify_array中的m是局部变量,因此main内的m仍未被初始化。

更明确的是代码流:

main m开头的

是一个随机的,未分配的内存地址。然后它用该内存地址调用create_and_modify_array。在create_and_modify_array内创建了一个名为m的新变量,它具有传入的随机,未分配的内存地址。然后在array内调用变量m {1}}被分配给您分配的内存。

问题在于create_and_modify_array的值永远不会传递回m中的m

为此,您需要将指向主main的指针传递到m

create_and_modify_array