我想动态分配一部分字符数组。
因此,大小为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;
}
还有其他条件作为一种命令切换工作,但它们与我的程序所展示的错误无关。我把这个问题缩小了。