尝试打印数组的第一个值时出现分段错误

时间:2017-08-13 23:53:42

标签: c segmentation-fault

这是我的代码:

#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);。知道我为什么会出现分段错误吗?

1 个答案:

答案 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);