[英]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
將導致檢測到堆損壞錯誤。
我不知道為什么會這樣,它與new
和malloc
什么不同。
n[a] = 0;
此行並用索引a
進一步訪問數組n
的元素會導致未定義的行為,這就是程序有時崩潰的原因。
如果您需要使用索引a
處理元素,則為此分配足夠的內存:
int *n = new int[a + 1];
n[a] = 0;
是未定義的行為。 即使使用malloc
它也是未定義的行為。 考慮到未定義的行為是不確定的,並且與所使用的函數或您可能想到的內容無關,因此停止推理未定義的行為是合乎邏輯的。
超出范圍訪問數組索引是未定義的行為。
另外,如果您正在使用scanf
,請正確使用它-應該檢查scanf
返回的結果以了解它是否成功。
請注意,您關於使用new
和malloc
創建差異行為的想法是錯誤的。 這是行為不明確的事情之一。 它可能也可以工作-但這並不意味着它每次都會確定地工作。 小心。
您也可以使用malloc
分配必要的內存量。 (當然,您也可以使用new
來做到這一點)。
if( (n=malloc(sizeof(*n)*(a+1)))==NULL){
perror("malloc");
exit(EXIT_FAILURE);
}
使用malloc
分配的內存只能使用free
釋放,對於new
內存,它將被delete
。 否則是錯誤的。
new
和malloc
輸出不同的結果,因為一個是C ++,另一個是C。兩者的實現完全不同。 另請參閱其他答案,告訴您您的程序具有UB。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.