2013-11-23 1 views
3

Я написал небольшую программу, чтобы привыкнуть к memset() операции:Использование MemSet() в C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <limits.h> 

int main() 
{ 
    int arr[10], i; 
    int t = INT_MAX; 
    memset(arr, t, sizeof(arr)); 
    for (i = 0; i < 10; i++) 
     printf("%d\t",arr[i]); 

    printf("%d",t); 
    return 0; 
} 

Результатом вышеприведенной программы является:

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 

2147483647 

Что такое поведение memset() в вышеуказанной программе? Почему он устанавливает элементы массива в -1?

ответ

11

memset принимает только младшие восемь бит значения и заполняет весь буфер этими битами. Нижние восемь бит MAX_INT - все (0xFF), и, таким образом, после этого массив заполняется всеми. Для целых чисел со знаком это -1.

+0

Предполагая, что int - 32 бита, 4 байта, вы имеете в виду, что memset использует только биты 0-7, чтобы определить значение, которое они представляют, и поместить это значение в целевую ячейку памяти? Если да, это значит также, поскольку unsigned char может обрабатывать только старомодный ascii? – icbytes

+0

Я не уверен, что понимаю этот вопрос. бит от 0 до 7 - это восемь бит, что на один бит больше, чем ascii (если вы не учитываете четность). Но да, если вам нужен шаблон размером более 8 бит, вам нужно использовать другую функцию (wmemset приходит на ум) или цикл for. –

+0

Хорошо. Вы хорошо поняли и ответили на мой вопрос. Спасибо. – icbytes

0

Memset устанавливает первый размер (обр.) Байтов блока памяти, на который указывает arr, на t, интерпретируемый как символ без знака. Так что вы получаете, когда вы читаете ints из arr, зависит от интерпретации этих байтов на вашей платформе.