以下简单示例在尝试访问m
内main
的第一个元素时导致分段错误。
为什么会这样?
如何修复它,但仍然保持代码的整体结构相同?
感谢。
#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]);
}
答案 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