Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么printf()函数会破坏C中的指针地址?_C++ - Fatal编程技术网

C++ 为什么printf()函数会破坏C中的指针地址?

C++ 为什么printf()函数会破坏C中的指针地址?,c++,C++,我尝试这样一个关于数组反转的示例: #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

我尝试这样一个关于数组反转的示例:

#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 %d\n",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;
}
#包括
#包括
#定义arr_大小(dizi)(sizeof(dizi)/sizeof((dizi)[0]))
样板
int*dizi_cevir(F&dizi)){
int-boyut=arr_尺寸(dizi);
内顿[博尤特];
对于(int i=0,k=boyut-1;i
template
int*dizi_cevir(F&dizi)){
int-boyut=arr_尺寸(dizi);

int donen[boyut];//
return donen;
-您的程序调用未定义的行为。
donen
函数一返回就不再存在,但您返回并取消引用一个指向它的悬空指针。仅供参考,clang返回一个关于此的漂亮警告,不应忽略:“.CPU:15:12:与本地变量“DONEN”返回的堆栈内存的地址]使用STD::向量代替数组。STD::向量也有一个反向迭代器。@ MANN66不想使用C++ STD库,我只是尝试了一个指针的例子。arrays@WhozCraig感谢您的推荐,有没有办法返回指针或int数组[]函数中?永远不要返回指向在堆栈上分配的变量的指针*@natrollus要么就地反转它(因此将结果存储在输入数组中),要么需要在堆上而不是在堆栈上分配结果数组。@natrollus或者让调用方分配反转的数组并将其作为参数传递 cevirmeden önce dizi(before reverse): 1 2 3 4 5 cevirdikden sonra(after reverse): 5 4 3 2 8 ^==== must be 1,when i delete or move above printf() which include (after reverse) then it prints 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?!
}