为什么printf()函数打破了C中的指针adress

Why printf() function broke pointer adress in C?

本文关键字:指针 adress printf 函数 为什么      更新时间:2023-10-16

我尝试一个关于阵列反向的示例:

#include <cstdio>
#include <cstdlib>
#define arr_size(dizi) (sizeof(dizi)/sizeof((dizi)[0]))
template<class F>
int* dizi_cevir(F (&dizi)){
    int boyut = arr_size(dizi);
    int donen[boyut];
    for (int i=0, k=boyut-1;i<boyut;i++,k--){
        donen[i] = dizi[k];
    }
    return donen;
}
int main() {
    int dizi[] = {1,2,3,4,5};
    printf("cevirmeden önce dizi(before reverse):n");
    printf("%d %d %d %d %dn",dizi[0],dizi[1],dizi[2],dizi[3],dizi[4]);
    int *pt = dizi_cevir(dizi);
    printf("cevirdikden sonra(after reverse):n"); //problem is here
    printf("%i %i %i %i %i",*(pt),*(pt+1),*(pt+2),*(pt+3),*(pt+4));
    return 0;
}

但是我有这样的输出:

CevirmedenÖncedizi(反向之前):1 2 3 4 5Cevirdikden Sonra(反向后):5 4 3 2 8        ^====必须是1,当我删除或移动printf()上方(反向后),然后打印1

这种情况的原因是什么?

template<class F>
int* dizi_cevir(F (&dizi)){
    int boyut = arr_size(dizi);
    int donen[boyut]; // <-- Stack allocated
    for (int i=0, k=boyut-1;i<boyut;i++,k--){
        donen[i] = dizi[k];
    }
    return donen; // And returned?!
}

非常简单,您绝不能将指针返回到堆栈中进一步分配的变量。在这种情况下,donen仅在dizi_cevir函数执行期间仅保证存在。

它仅适用于前4个元素的机会,因为printf没有触摸它们。

函数dizi_cevir返回后,将免费存储局部变量的内存,可以通过任何将来的函数调用重新使用。