C中的数据结构指针处理

时间:2013-04-29 20:05:09

标签: c memory-management struct linked-list

我有这样的结构;

struct abc
{
    char bbb[10];
    char ccc[4];
    char ddd[6];
    int i1;
    int i2;
    struct abc *prior, *next;
};
struct abb *start, *last, *this, *temp;

我有很多代码使用这些指针start,last等等所以我想使用它们但是我想在结构中添加指针和指针以完成以下内容: 然后根据i1的值加载结构,例如,当i1 = 0的值或i1 = 1的值或结构的内容而不管i1的值时,显示和更改数据。并且,在一天结束时,将整个结构保存到文件中,并在三个条件中的任何一个条件下进行更改。 我想添加了如下指针:

    struct abc *prior1, *next1;
    struct abc *prior2, *next2;
};
struct abb *start1, *last1...etc.
struct abb *start2, *last2...etc.

我可以:

start = start1;
last  = last1;

但我怎么引用

prior1
next1

或者告诉我更好的方法。

2 个答案:

答案 0 :(得分:0)

这听起来像是在询问有关序列化策略的建议。我建议免费写运算符<<和运算符>> 处理结构上I / O的方法,其中指针在 map 中引用,为每个指定一个递增的数字ID 值。在写入时,在访问每个结构指针时,检查地图,如果找到了ID,则只需写出ID而不是其他内容。否则,将下一个可用ID添加到映射,将ID分配给指针,然后写出整个结构。在阅读时,您可以反转该过程,读入每个ID并在地图中查找该指针。如果找不到,则会有第一个实例,因此您继续读取整个结构并将其存储在地图中。否则,从地图中检索先前读取的结构并分配指针。此强制策略由 CArchive 序列化(Microsoft基础类)使用。可能有一些开源库也可以这样做。

答案 1 :(得分:0)

你的问题不是很清楚。

您可能只需要查看C指针,以及start->prior这样的语法,它引用prior中包含的start的值。

E.g。

// Set the i1 value of start to 42

start->i1 = 42;

printf("The answer is: %d\n", start->i2);

或者您可能希望使用等效的方法与您的某个结构进行交互。

例如:

struct abc
{
    char bbb[10];
    char ccc[4];
    char ddd[6];
    int i1;
    int i2;
    struct abc *prior, *next;
};

struct abb *start, *last, *this, *temp;

/**
 * Set the BBB of struct target to a given value.
 * @param   value     the value to set
 * @return            pointer to the target
 */
struct abc *setBBB(struct abc *target, char *value)
{
    strncpy(target->bbb, value, sizeof(target->bbb));
    return target;
}

char *getBBB(struct abc *target)
{
    return target->bbb;
}

struct abc *next(struct abc *target)
{
    return target->next;
}

int getI1(struct abc *target)
{
    return target->i1;
}
  

完成以下操作:然后使用数据加载struct   例如,取决于i1的值,显示和更改数据时   i1的值= 0或当i1的值= 1或者内容时   结构,无论i1的值如何。

您可以这样做:

switch(getI1(start))
{
    case 0:
        setBBB(start, "Hello"); // NOTE: to treat this as a string,
                                // at most 9 characters are allowed,
                                // else the terminating zero will be lost.
        break;
    case 1:
        setBBB(start, "World"); // ditto.
        break;
    ...
}
  

并且,在一天结束时将整个结构保存到文件中,并在三个条件中的任何一个条件下进行更改。

您想要将结构保存到文件中,您需要类似

的内容
int saveStruct(char *filename, int position, struct abc *target)
{
    int ret;
    FILE *fp;
    if (NULL == (fp = fopen(filename, "r+")))
    {
        if (NULL == (fp = fopen(filename, "w")))
        {
            return -1; // Error.
        }
    }
    fseek(fp, position * sizeof(struct abc), SEEK_SET);
    ret = fwrite(target,  sizeof(struct abc), 1, fp);
    fclose(fp);
    return ret;
}

但上面有一些问题。一旦保存到磁盘,指针(* previous和* next)的值将变得毫无意义,并且从磁盘加载时将保持不变。因此loadStruct()函数需要将* previous和* next的值作为附加参数进行恢复。

此外,如果你之前没有在#0位置保存一个结构,你就不能(但这取决于平台)在#1位置保存一个结构。每次保存都会进行昂贵的开放式结算。

int loadStruct(char *filename, int position, struct abc *target)
{
    int ret;
    FILE *fp;
    if (NULL == (fp = fopen(filename, "r")))
    {
        return -1; // Error.
    }
    fseek(fp, position * sizeof(struct abc), SEEK_SET);
    ret = fread(target,  sizeof(struct abc), 1, fp);

    target->prior = NULL;
    target->next  = NULL;

    fclose(fp);
    return ret;
}

//以上测试用以下测试用例进行测试,返回' Hello!'如预期的那样。

int main()
{
    struct abc *start, *another;
    start   = malloc(sizeof(struct abc));
    setBBB(start, "Hello!");
    saveStruct("file.bin", 0, start);

    another = malloc(sizeof(struct abc));
    loadStruct("file.bin", 0, another);

    printf("Re-read: %s.\n", getBBB(another));
}