这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int * get_arr(int max_val) {
int arr[max_val];
arr[0] = 1;
printf("%d\n", arr[0]);
return arr;
}
// a function that appears to have nothing to do with i and pt
int some_other_function() {
int junk = 999;
return junk;
}
int main () {
int *pt = get_arr(10);
printf("access before: %d\n", *pt);
// try this program with and without this function call
some_other_function();
printf("but if I try to access i now via *pt I get %d\n", *pt);
printf("here\n");
return 0;
}
当我编译并运行此代码时,打印segmentation fault
后得到1
(基本上,运行此printf("access before: %d\n", *pt);
时出现分段错误)。当我删除该行
printf("access before: %d\n", *pt);
我在这里仍然遇到分段错误printf("but if I try to access i now via *pt I get %d\n", *pt);
。知道我为什么会出现分段错误吗?
答案 0 :(得分:1)
您需要将arr的值放在堆上,而不是堆栈上。当你调用some_other_function()
时,arr的值被覆盖,因为另一个函数已经结束,并且不再保证分配的内存在那里。
试试这个:
int * get_arr(int max_val) {
int *arr = malloc(sizeof(int) * max_val);
arr[0] = 1;
printf("%d\n", arr[0]);
return arr;
}
请记住在使用完阵列后调用free(pt);
。