我是一個新手程序員,但通常我可以解開我自己的問題。這一次我解決了這個問題,但它仍然困擾着我。一位朋友建議我向這個社區徵求意見。sprintf緩衝區大小
我試圖在C中打印數字。我有一個函數使用sprintf來執行此操作。數字不能超過2位,所以我使用2個字符的緩衝區。不知何故,這是我的邏輯失敗的地方,因爲這會通過修改傳遞給sprintf的變量之一導致無限循環,但增加緩衝區大小可解決問題。
這裏的失敗代碼:
#include <stdio.h>
void printarray(int array[][4]) {
int y;
int z;
char buf[2];
for (y=0; y<4; y++) {
for (z=0; z<4; z++) {
sprintf(buf, "%d", array[y][z]);
printf("buf is %s, y is %d and z is %d\n",buf,y,z);
}
}
}
int main() {
int arr[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0} };
printarray(arr);
return 0;
}
儘快爲y到達2,它被重置爲0,這樣無限循環。改變buf [2]到buf [8]解決了這個問題。
當buf被溢出時,無限循環發生的原因是因爲sprintf將buf [2]設置爲'\ 0'。很可能在堆棧buf之後是z(小端)。因此,z的低字節被設置爲0,因爲高字節已經爲0,所以每次將z設置爲0。 – jstanley