簡體   English   中英

指針地址被覆蓋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM