C语言 从字符串中动态分配字符串的空间


我想这是我

正在研究的一个非常复杂的想法

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格式说明符的地方。

strlen用于

知道字符串中存储了多少有用的字符。为此,它会计算在查看终止字符串(哨兵)的 NULL 字符之前设置了多少个字符。

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

因此,要记住容量,您必须存储它。一个好的方法是将指针和容量都存储到结构中,以确保两者永远不会分开:

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

相关内容

  • 没有找到相关文章