重新分配作为参数

时间:2017-10-27 00:24:25

标签: c pointers memory-management malloc realloc

我想动态分配一部分字符数组。

因此,大小为100的数组的一部分是具体的。假设10是永久内存,另外90是动态内存。

我试图逐个阅读,直到我决定放弃并采取我认为可行的捷径。但是我最终得到的错误是

  

对于释放的对象的校验和不正确 - 可能修改了对象   被释放后

我在main中的while循环中使用此方法,并且在while循环处理之后我几乎完全释放所有内容。因为,我在while循环之外有声明。我想在while循环会话中读取一个对象,因为这些对象最终被添加到对象列表中。然而,while循环的范围会导致分段问题,它无法记住有关该对象的任何内容。我离题)。

这是我的尝试。

Object* read(char* str)
{
    Object* object = (Object*)malloc(sizeof(*object));
    object->identity[0] = 0;
    int capacity = (100 + 1) - (10);
    object->name = (char*)malloc(capacity * sizeof(*object->name));
    object->value = 0.0;

    int length = strlen(str);
    if (length > capacity)
        object->name = (char*)realloc(object->name, (capacity * 2) * sizeof(*object->name));

    int arguments = sscanf(str, "%" STRING_SPACE "s %lf %[^\n]s",
        object->identity,
        &object->value,
        object->name);

    if (arguments == MATCHER) {
        return object;
    } else {
        return NULL;
    }

    return object;
}

在这种情况下,对象具有可变大小的名称,但为其标识分配了固定数量的空间。

我尝试了sscanf的其他内容,但意识到它永远不会起作用,因为我太晚读取字符串以将内存分配给name。看到;

/*
int len = 0;
for (char* itemObserve = item->name; *itemObserve; itemObserve++) {
    if (len == sizeof(item->name)) {
        capacity *= MULTIPLIER;
        item->name = (char*)realloc(item->name, capacity * sizeof(*item->name));
    }
    len++;
}
*/

以下是main中的代码,未定义的内容可能与错误无关:

int main()
{
    FILE* stream;
    Object* object;
    ObjectList* list = initList();

    while (true) {
        char* line;
        char cmd[15] = {0};
        char* arg;
        char* rest;

        printf("> ");
        line = getline(stdin);

        arg = (char*)malloc(35 * sizeof(*arg));
        rest = (char*)malloc(35 * sizeof(*rest));
        int arguments = sscanf(line, "%s %s %[^\n]", cmd, arg, rest);
        free(line);
        line = NULL;

        printf("\n");

        if (strcmp(cmd, "add") == 0) {
            arg = (char*)realloc(arg, (35 * 2) * sizeof(*arg));
            sprintf(arg, "%s %s", arg, rest);
            if ((object = read(arg)) == NULL) {
                continue;
            }
            objectListAdd(list, object);
        } else {
            free(rest);
            free(arg);
            exit(EXIT_SUCCESS);
        }
        free(rest);
        free(arg);
    }
    freeObject(object);
    freeObjectList(list);
    return EXIT_SUCCESS;
}

主文件中的单独的getline函数

char* getline(FILE* stream)
{
    int capacity = LINE_MAX + 1;
    char* buffer = (char*)malloc(capacity * sizeof(*buffer));
    int len = 0;
    int ch;
    while ((ch = fgetc(stream)) != '\n' && (ch != EOF)) {
        if (len == capacity) {
            capacity *= MULTIPLIER;
            buffer = (char*)realloc(buffer, capacity * sizeof(*buffer));
        }
        buffer[len++] = ch;
    }
    if (ch == EOF) {
        return NULL;
    }
    buffer[len] = '\0';
    if (buffer == NULL)
        return NULL;
    return buffer;
}

还有其他条件作为一种命令切换工作,但它们与我的程序所展示的错误无关。我把这个问题缩小了。

0 个答案:

没有答案