2013-08-09 2 views
1

Я пытаюсь скопировать функцию memset. По причине я не понимаю, следующий код не работает и производит странные результаты:memset clone производит странные результаты

#include <sys/types.h> 

void *mem_set(void *dst, int c, size_t n) 
{ 
    char *d; 
    size_t i; 

    d = dst; 
    for (i = 0; i < n; i++) 
     d[i] = (unsigned char) c; 
    return dst; 
} 

Вот тест:

int  *a; 
a = malloc(4 * sizeof(int)); 
a[0] = 1; 
a[1] = 2; 
a[2] = 3; 
a[3] = 4; 
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]); 
mem_set(a, 1, 4); 
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]); 
free(a); 

А вот выход:

1 2 3 4 
16843009 2 3 4 
+4

'sizeof (int)! = Sizeof (char)' – wildplasser

+0

Проблема в том, что ваш массив 'a' является массивом' int', но ваш 'mem_set' принимает байты (символы). Попробуйте 'char * a;' и 'malloc (4 * sizeof (char));' – lurker

+0

Прежде чем спросить: «Что случилось с моей реализацией« memset », возможно, сначала вы должны сравнить результаты своей реализации с результатами обычного 'memset'. – jamesdlin

ответ

2

Ваш memset в порядке. Просто вы не используете его правильно (или не понимаете, что он должен делать, когда применяется к массиву int).

Для того, чтобы заполнить весь массив, то

mem_set(a, 1, 4); 

следует читать

mem_set(a, 1, 4 * sizeof(int)); 

Выходной сигнал должен затем стать 16843009 16843009 16843009 16843009 (т.е. 0x01010101 повторяется четыре раза [1]). Если вы ожидаете, что выход будет 1 1 1 1, то memset не подходит для работы.

[1] Предполагая, ради аргумента, что sizeof(int)==4.

+3

Или: 'mem_set (a, 1, 4 * sizeof * a);' – wildplasser

Смежные вопросы