我在main中声明了一个指针。然后我分配内存并在函数内初始化值,然后返回main并打印数据。出于某种原因,当我在func1中分配,初始化和打印时,它可以工作。有一次,我离开了func虽然我有错误。我已经搜索了这个问题,并在此网站上搜索了大约2个小时。我被卡住了。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int func1(int *array);
int main() {
int *array;
func1(array);
printf("Main: %d\n", array[1]);
return 0;
}
int func1(int *array) {
array = malloc(10 * sizeof(int));
printf("Enter an int: ");
scanf("%d", &array[1]);
printf("Func1: %d\n", array[1]);
}
这就是我的命令行:
Enter an int: 5
Func1: 5
Segmentation fault (core dumped)
答案 0 :(得分:4)
首先说一下术语,你的变量array
在技术上不是一个数组,它是一个指针。它可以指向可以用作数组的内存。
现在针对您的问题:当您将参数传递给函数时,按值传递,这意味着它们被复制。因此,在函数func1
中,参数array
只是一个副本,更改副本不会更改原始副本。由于原始版本未更改,您将在main
函数中取消引用未初始化的指针,从而导致undefined behavior和崩溃。
要解决此问题,您必须模拟按引用传递。这是通过使用指针传递参数来完成的。在这种情况下,您必须将指针传递给指针。
首先,您当然需要更改功能:
void func1(int **array) {
*array = malloc(10 * sizeof(int));
printf("Enter an int: ");
scanf("%d", &(*array)[1]);
printf("Func1: %d\n", (*array)[1]);
}
然后在调用函数
时需要使用address-of运算符&
int *array;
func1(&array);
重要提示:malloc
函数不会初始化它分配的内存,这意味着内存的内容是不确定。只有已分配内存的第二个int
元素被初始化并且可以被正确引用,读取所有其他元素也会导致未定义的行为。
另一件事,也导致了未定义的行为,并且正如Namfuak所指出的那样,在原始函数func1
中,您声明它返回一个整数,但是你没有实际上什么都归还这就是为什么我在回答void
的答案中改变了这里的功能。