C 从字符串中为字符串动态分配空间

C 从字符串中为字符串动态分配空间,c,function,pointers,memory-management,malloc,C,Function,Pointers,Memory Management,Malloc,我想这是一个非常复杂的想法 int capacity = 100; name = malloc(capacity * sizeof(char)); int len = 0; char* i; for (i = str; *i; i++) { if (len >= strlen(name)) { capacity *= 2; name = realloc(name, len * sizeof(char)); } len++; } 假设

我想这是一个非常复杂的想法

int capacity = 100;
name = malloc(capacity * sizeof(char));
int len = 0;
char* i;
for (i = str; *i; i++) {
    if (len >= strlen(name)) {
        capacity *= 2;
        name = realloc(name, len * sizeof(char));
    }
    len++;
}
假设name已经声明为char指针,str作为参数传入。为什么这不能使数组的大小增加一倍

我采取的另一种方法是

int nameLength = 0;
int capacity = 100;
char* name = NULL;
double price = 0.0;
int position = 0;
if (sscanf(str, "add %s %lf %n", name, &price, &position)) {
    nameLength = capacity - position;
    capacity += nameLength;
    name = realloc(name, capacity * sizeof(char));
} else {
    name = malloc(REMAINING_MAX * sizeof(char));
}
我试图利用%n格式说明符。

用于了解字符串中存储了多少有用字符。为此,它会在查看NULL char之前计算设置了多少char,NULL char将终止sentinel中的字符串\0

您正在将未初始化的值传递给此函数:这是一个未定义的行为。事实上,名称是用malloc初始化的,但分配的内存即名称所指的值仍然未初始化!由名称指向的字符串可以存储任何类型的值。而且不可能知道会发生什么:它会失败,或者如果你运气不好,它会正确运行,直到未来的崩溃。所以永远不要使用单位化的价值

所以,要记住容量,就必须存储它。一种好的方法是存储指向结构的指针和容量,以确保两者永远不会分离:

struct ResizeableString {
    size_t capacity;
    char * str;
};

斯特伦不会给你这个能力。什么能给我这个能力?好的,sizeof,但这不适合我你的可变容量。在C语言中,无法获得已分配内存块的容量。你必须自己记住它。请复习gfys usc fun kma jamf