2014-10-17 3 views
0

Какой символ имеет двоичное представление всех нулей?Символ для представления битов

Для контекста, я задаюсь вопросом, как получить массив битов из всех нулей и новой для C/C++

unsigned char** result = (unsigned char**) malloc(sizeof(unsigned char) 
               * rows); 
for (int i = 0 ; i < rows ; i++) { 
    result[i] = (unsigned char *) malloc(sizeof(unsigned char) * cols); 
    memset(result[i], 0, sizeof(unsigned char) * cols); 
    } 

Когда я затем попытаться напечатать разрядное представление (с использованием C & 128, с & 64, я все еще получаю биты, которые установлены)

Например: (для строк = 3 и перевалов = 2)

00100000 00110111 
00000000 00000000 
00000000 00000000 
+0

Это выглядит нормально, но вы можете показать полный источник, включая часть, которая выводит результат и устанавливает значения строк и столбцов? – Rein

+1

Этот код является неправильным; в первой строке нужно выделить «rows» раз размер 'char *'. – usr2564301

+0

'malloc (sizeof (unsigned char *) * rows)', 'calloc (CHAR_BIT * cols + 1, sizeof (unsigned char))', 'memset (результат [i], '0', CHAR_BIT * cols)' – BLUEPIXY

ответ

1

В Вашей первой линии, ваш таНос выделяет неправильный размер. Вы выделяете для unsigned char, когда вы должны выделять достаточно для указателя на один, как показано ниже.

unsigned char** result = (unsigned char**) malloc(sizeof(unsigned char *) * rows); 

Это означает, что наиболее значимые байты из ваших предыдущих указателей, выделенных в пределах вашей петли быть затерты преуспевающим таНосом результата. Поэтому, когда вы смотрите на result[i], вы больше не смотрите в нужное место в памяти.

-1

Похоже, что вы неправильно типа

unsigned char** 

И вы относитесь к нему так, как если бы это был массив, но это всего лишь указатель на указатель на unsigned char. Попробуйте заменить

unsigned char** result = (unsigned char**) malloc(sizeof(unsigned char) * rows); 

с

unsigned char* result[] = new (unsigned char*)[rows]; 

, то вы можете работать с переменным результатом, как на массиве.

И заменить

result[i] = (unsigned char *) malloc(sizeof(unsigned char) * cols); 

с

result[i] = new unsigned char[cols]; 

При освобождении памяти также необходимо вызвать

delete[] result[i]; 

и

delete[] result; 

вместо

free() 
+1

Это код C, а не C++. – Dan

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