簡體   English   中英

為什么new和malloc輸出不同的結果?

[英]Why does new and malloc output different results?

這是我的代碼;

#include <cstdio>
#include <cstdlib>
using namespace std;

int MIN(int a, int b)
{
    if (a <= b) return a;
    else return b;
}

int main(void)
{
    int a; 
    scanf("%d", &a);

    int *n = new int[a];
    //int *n = (int *)malloc(sizeof(int)*(a));
    for (int i = 0; i < a; i++)
        n[i] = a;

    n[a] = 0;

    for (int i = a; i > 1; i--)
    {
        if (i % 3 == 0) n[i / 3] = MIN(n[i] + 1, n[i / 3]);
        else if (i % 2 == 0) n[i / 2] = MIN(n[i] + 1, n[i / 2]);
        n[i - 1] = MIN(n[i] + 1, n[i - 1]);
    }

    printf("%d", n[1]);

    delete[] n;
    //free(n);
    return 0;
}

如果使用new ,則什么都不會發生。

但是,使用malloc將導致檢測到堆損壞錯誤。

我不知道為什么會這樣,它與newmalloc什么不同。

n[a] = 0;

此行並用索引a進一步訪問數組n的元素會導致未定義的行為,這就是程序有時崩潰的原因。

如果您需要使用索引a處理元素,則為此分配足夠的內存:

int *n = new int[a + 1];

n[a] = 0; 是未定義的行為。 即使使用malloc它也是未定義的行為。 考慮到未定義的行為是不確定的,並且與所使用的函數或您可能想到的內容無關,因此停止推理未定義的行為是合乎邏輯的。

超出范圍訪問數組索引是未定義的行為。

另外,如果您正在使用scanf ,請正確使用它-應該檢查scanf返回的結果以了解它是否成功。

請注意,您關於使用newmalloc創建差異行為的想法是錯誤的。 這是行為不明確的事情之一。 它可能也可以工作-但這並不意味着它每次都會確定地工作。 小心。

您也可以使用malloc分配必要的內存量。 (當然,您也可以使用new來做到這一點)。

if( (n=malloc(sizeof(*n)*(a+1)))==NULL){
   perror("malloc");
   exit(EXIT_FAILURE);
}

使用malloc分配的內存只能使用free釋放,對於new內存,它將被delete 否則是錯誤的。

newmalloc輸出不同的結果,因為一個是C ++,另一個是C。兩者的實現完全不同。 另請參閱其他答案,告訴您您的程序具有UB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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