不能使用指針的範圍之外的本地陣列,其中該陣列被定義,因爲它是存儲在所述函數的堆棧幀和將被彈出當函數結束並返回,所以它將不再有效使用它(讀取它)。相反,你可以從調用者函數傳遞數組。
// In the caller function
char data[64];
intToAscii(1234, data);
而且intToAscii()
功能,只需
void intToAscii(unsigned long x, char *str)
{
int i;
unsigned long n;
for (i = 0; i < 63; i++) {
n = x >> 63;
if (n == 0) {
str[i] = '0';
} else {
str[i] = '1';
}
x = x << 1;
}
str[i] = '\0';
printf("Value of x is %s \n", str);
}
另一個錯誤,是你正在訪問的str
指數64,但陣列 -indexed所以64是出界此外, '\0'
終止符必須是最後一個字符後,你可以通過使用索引i
來實現這一點,在循環結束時它將具有正確的值,並且這種方式不管它是63還是64,它都是正確的值只要循環結束即可在數組的最後一個元素前面。
一兩件事,像這樣的功能是非常危險的,而不是你可以通過其他參數來告訴多少字節目標數組像這樣提供的功能,
void intToAscii(unsigned long x, char *str, size_t size)
{
int i;
unsigned long n;
for (i = 0; i < size - 1; i++) {
n = x >> 63;
if (n == 0) {
str[i] = '0';
} else {
str[i] = '1';
}
x = x << 1;
}
str[i] = '\0';
printf("Value of x is %s \n", str);
}
最後,正如有人評論通過@David C. Rankin你的函數返回char
但它的主體不會返回任何地方,這將導致未定義的行爲。你不需要你的函數返回任何東西,因爲它修改了這個數組。
請注意,'unsigned long'可能只有32位。更好的用戶'無符號long long'或'uint46_t'等'char str [64]; ... str [64] ='\ 0';'是一個問題。 – chux
我相信@chux打算'uint64_t'':)' –