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;itemplate
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?!
}