这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int * get_arr(int max_val) {
int arr[max_val];
arr[0] = 1;
printf("%dn", 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: %dn", *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 %dn", *pt);
printf("heren");
return 0;
}
当我编译并运行此代码时,我在打印1
后出现segmentation fault
(因此基本上,运行此printf("access before: %dn", *pt);
时存在分段错误(。当我删除该行时
printf("access before: %dn", *pt);
我在这里仍然遇到分割错误printf("but if I try to access i now via *pt I get %dn", *pt);
.知道为什么我会遇到分段错误吗?
您需要将 arr 的值放在堆上,而不是堆栈上。调用some_other_function()
时,arr 的值将被覆盖,因为另一个函数已结束,并且不再保证分配的内存存在。
试试这个:
int * get_arr(int max_val) {
int *arr = malloc(sizeof(int) * max_val);
arr[0] = 1;
printf("%dn", arr[0]);
return arr;
}
只需记住在使用完数组后调用free(pt);
即可。