Почему memset () неправильно инициализирует int?

Почему на выходе следующая программа 84215045 ?

int grid[110];
int main()
{
    memset(grid, 5, 100 * sizeof(int));
    printf("%d", grid[0]);
    return 0;
}
24
задан Mateen Ulhaq 18 August 2011 в 06:07
поделиться

2 ответа

memset(grid, 5, 100 * sizeof(int));

Вы устанавливаете 400 байтов, начиная с (char*)grid и заканчивая (char*)grid + (100 * sizeof(int)), значением 5 (здесь необходимо преобразование, потому что memset имеет дело с байтами , в то время как арифметика указателей имеет место в objects.

84215045 в шестнадцатеричном виде 0x05050505, поскольку int (на вашей платформе / компиляторе и т. д.) представляется четырьмя байтами, когда вы его печатаете, вы получите «четыре пятерки».

12
ответ дан 28 November 2019 в 22:21
поделиться

Поскольку memset записывает байты, я обычно использую его для установки массива int на ноль, например:

int a[100];
memset(a,0,sizeof(a));

, или вы можете использовать его для установки массива char, поскольку char - это точно байт:

char a[100];
memset(a,'*',sizeof(a));

Более того, массив int также может быть установлен в -1 с помощью memset:

memset(a,-1,sizeof(a));

Это потому, что -1 равно 0xffffffff в int и 0xff в char ( байт).

0
ответ дан 28 November 2019 в 22:21
поделиться