为什么printf()函数打破了C中的指针adress
Why printf() function broke pointer adress in 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=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
返回后,将免费存储局部变量的内存,可以通过任何将来的函数调用重新使用。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将指向Adress 0指向ADRESS 0的指针在C 中做什么?
- 为什么printf()函数打破了C中的指针adress