[英]Pointer addresses are getting overwritten
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
using namespace std;
int d;
long long int *arr = (long long int*)malloc(d * sizeof(long long int));
int* func(){
int *p = (int*)malloc(sizeof(int));
*p =5;
return p;
}
int main(){
int *p = NULL;
p = func();
d =10;
printf("add of p: %d\n\n",p);
int i=0;
for(;i<10;i++){
printf("Add of arr: %d \n",arr+i);
}
return 0;
}
分配給指針“p”的地址被數組“arr”的某個位置的地址覆蓋。 為什么會這樣? 即使“malloc”在堆中分配 memory。
此外,如果我對“p”和“arr”使用相同的數據類型,則不會出現此類問題。
代碼 Output:
你清楚地認為你已經分配了一個大小為 10 的數組。但是當這個表達式被執行時
long long int *arr = (long long int*)malloc(d * sizeof(long long int));
d
的值為零。 d
是一個全局變量,因此默認初始化為零。 令人困惑的是, main
中還有另一個名為d
的變量,但這與arr
的分配完全沒有關系。
在將d
設置為 10 之前,您使用d
的值來決定將什么傳遞給malloc
。 然后,當您將d
的值設置為 10 時,它是一個不同的d
,因為您在全局 scope 有一個,而在main
范圍內有一個。
這只是Undefined Behaviour
。 有一些與內存相關的問題(比如訪問越界的數組..),其中 C/C++ 只是說明如果所有內容都正確訪問並且所有其他內容都未定義會發生什么。 所以它可能有一天會起作用,也可能不會。
就像上面提到的答案一樣,您這邊的歧義會導致未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.