c - 使用 "char"的 boolean 数组

标签 c arrays free malloc boolean

我制作了一个对象,它实际上表示存储在 char 中的 8 个 boolean 值数组。我这样做是为了学习更多关于按位运算符和在 C 中创建自己的对象的知识。所以我有两个问题:

  1. 我可以确定下面的代码是否 总是有效?
  2. 这是一个很好的实现吗 制作一个不会丢失的对象 在 C 中,除非你释放它 你自己。

代码:

/*
 *  IEFBooleanArray.h
 *  IEFBooleanArray
 *
 *  Created by ief2 on 8/08/10.
 *  Copyright 2010 ief2. All rights reserved.
 *
 */

#ifndef IEFBOOLEANARRAY_H
#define IEFBOOLEANARRAY_H

#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef char * IEFBooleanArrayRef;

void IEFBooleanArrayCreate(IEFBooleanArrayRef *ref);
void IEFBooleanArrayRelease(IEFBooleanArrayRef ref);
int IEFBooleanArraySetBitAtIndex(IEFBooleanArrayRef ref, 
                                 unsigned index, 
                                 int flag);
int IEFBooleanArrayGetBitAtIndex(IEFBooleanArrayRef ref, 
                                 unsigned index);

#endif

/*
 *  IEFBooleanArray.c
 *  IEFBooleanArray
 *
 *  Created by ief2 on 8/08/10.
 *  Copyright 2010 ief2. All rights reserved.
 *
 */

#include "IEFBooleanArray.h"

void IEFBooleanArrayCreate(IEFBooleanArrayRef *ref) {
    IEFBooleanArrayRef newReference;

    newReference = malloc(sizeof(char));
    memset(newReference, 0, sizeof(char));
    *ref = newReference;
}

void IEFBooleanArrayRelease(IEFBooleanArrayRef ref) {
    free(ref);
}

int IEFBooleanArraySetBitAtIndex(IEFBooleanArrayRef ref, unsigned index, int flag) {
    int orignalStatus;

    if(index < 0 || index > 7)
        return -1;

    if(flag == 0)
        flag = 0;
    else
        flag = 1;

    orignalStatus = IEFBooleanArrayGetBitAtIndex(ref, index);
    if(orignalStatus == 0 && flag == 1)
        *ref = *ref + (int)pow(2, index);
    else if(orignalStatus == 1 && flag == 0)
        *ref = *ref - (int)pow(2, index);

    return 0;
}

int IEFBooleanArrayGetBitAtIndex(IEFBooleanArrayRef ref, unsigned index) {
    int result;
    int value;

    value = (int)pow(2, index);
    result = value & *ref;

    if(result == 0)
        return 0;
    else
        return 1;
}

我更像是一个 Objective-C 的人,但我真的很想学习更多的 C。任何人都可以要求一些我可以提高自己的“作业”吗?

谢谢, IEF2

最佳答案

  1. 不要用< 0检查无符号类型,它没有意义,并且会在某些编译器上引起警告。
  2. 不要在未指定大小的情况下使用无符号类型(unsigned intunsigned char 等)。
  3. 如果flag == 0你为什么要把它设置为0
  4. 我不喜欢抽象 *远离typedef ,但这无论如何都不是错误
  5. 您无需调用 memset()将单个字节设置为 0 .
  6. 使用 pow计算一点偏移量是疯狂的。查看<<>>运算符并改用它们
  7. 将您的 if 完全括起来声明条件或为将来的调试痛苦做好准备。
  8. 如果您使用按位运算符 &|而不是算术 +-在你的SetBitAtIndex功能,你不需要所有那些复杂的if无论如何声明。
  9. 你的 GetBitAtIndex例程不进行边界检查 index .

我认为,从该列表中,#9 是唯一表示您的程序无法在所有情况下运行的列表。我没有详尽地测试它 - 这只是第一眼检查。

关于c - 使用 "char"的 boolean 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3432321/

相关文章:

将 TSV 文件中的内容转换为多维数组

c++ - 变量定义中的struct是什么意思?由 小码哥发布于

arrays - RxJS 限制和返回响应结果数组的最佳方式

c++ - 在 xmlTextReaderGetAttribute() 之后释放 xmlChar 指针

c - 在我的破坏函数中双重释放

c - C 中的自由链表

c - 如何跳过一个值并转到 fscanf() 中的下一个值,以及如何 fscanf() 特定类型

c - 堆栈不弹出正确的值

c - 如何在另一个数组中的用户指定位置插入一个数组并获取结果数组?

javascript - 排序函数对错误的数组进行排序?