Проверка изменений в массиве после memset к значению по умолчанию

0

У меня есть следующий код, в котором I: (1) инициализирует массив со значениями по умолчанию; (2) сделать что-то с массивом; (3) проверить, что массив по-прежнему по умолчанию. Я не уверен (3).

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

#define ARRAY_MAX 10
#define DEFAULT_VALUE 0

int main(int argc, char *argv[])
{
    uint32_t array[ARRAYMAX];

    memset(array, DEFAULT_VALUE, sizeof(array));
    do_something_with(array);
    check_array_is_default(array);
    return 0;
}

Способ, которым я проверял бы, является ли массив только значениями по умолчанию, является следующим (т.е. Так я бы написал функцию check_array_is_default()):

int check_array_is_default(uint32_t *array)
{
    int i;
    uint32_t defval = DEFAULT_VALUE;

    for (i = 0; i < ARRAY_MAX; i++)
    {
    if (memcmp((array + i * sizeof(uint32_t)), &defval, sizeof(uint32_t)))
    {
        return 0;
    }
    }
    return 1;
}
  • 2
    Вызов memset, вероятно, не будет делать то, что вы хотите для любого DEFAULT_VALUE, кроме 0 - он установит все байты в массиве на это значение, что будет означать, что элементы uint32_t будут иметь 4 копии этого значения, по одной на каждый байт.
Теги:
memory

1 ответ

0
Лучший ответ

memset заполняет байты, а не слова, поэтому вам нужно посмотреть байты отдельно:

int check_array_is_default(uint32_t *array)
{
    char *p = (char *)array;
    int n = ARRAY_MAX * sizeof(array[0]);
    for (int i = 0; i < n; i++) {
        if(p[i] != DEFAULT_VALUE) {
           return 0;
        }
    }
    return 1;
}
  • 0
    Да, сразу после того, как я написал это, я понял: «Почему я использую memcmp вместо ==?»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню