由于指標部分的一些運行時錯誤,我的代碼運行例外。這是我的代碼因為我犯了錯誤而表現得很奇怪。
#include<stdio.h>
void swap(int*, int*);
int main()
{
int a, b;
printf("Enter the value of a : ");
scanf("%d",&a);
printf("Enter the value of b : ");
scanf("%d",&b);
swap(&a,&b);
printf("Values of a and b after swapping are %d and %d respectively\n",a,b);
}
void swap(int *a, int *b)
{
int *temp;
printf("asdf");
*temp=*a;
printf("asdf");
*a=*b;
*b=*temp;
}
并且輸出是 Enter the value of a : 5 Enter the value of b : 2 asdf 我錯誤地將 temp設為指標變數而不是簡單的整數變數。但是為什么我的代碼不能再繼續作業并在那里結束?
uj5u.com熱心網友回復:
In swap,temp是一個未初始化的指標,所以你正在破壞記憶體。但它根本不應該是一個指標。將其更改為:
void swap(int *a, int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
原始代碼行為奇怪的原因是因為它存盤到未初始化指標的目標。該指標可以包含任何值,因此寫入其目標可以更改記憶體的任何部分。這稱為未定義行為。例如,它可以修改回傳地址或其他一些變數。該行為特定于您正在使用的特定編譯器、有效選項等。如果您真的想知道特定編譯器發生了什么,您需要查看匯編代碼和呼叫序列以準確查看未初始化的指標包含的內容以及修改其目標會產生什么效果。
uj5u.com熱心網友回復:
為什么我的代碼無法繼續作業并最終就在那里?
您的swap函式使程式具有未定義的行為:
void swap(int *a, int *b)
{
int *temp; // an uninitialized pointer - no memory allocated
*temp=*a; // assigning to *temp - and temp may be pointing anywhere
*a=*b;
*b=*temp;
}
上述分配是導致問題的原因。當程式有未定義的行為時,任何事情都可能發生——比如程式的突然終止。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/346329.html
