[英]Dynamically allocating space for a string from a string
我想这是一个非常复杂的想法
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
用于了解一个字符串中存储了多少个有用的字符。 为此,它计算在查看终止字符串\\0
(哨兵)的NULL char之前设置了多少char。
您正在向该函数传递未初始化的值:这是未定义的行为。 实际上, name
是使用malloc
初始化的,但是分配的内存(即name指向的值)仍未初始化! 名称指向的字符串可以存储任何类型的值。 而且不可能知道会发生什么:它将失败,或者如果您不幸运,它将正确运行(直到将来崩溃)。 因此, 切勿使用单位化的值。
因此,要记住容量,您必须存储它。 一个好的方法是将指针和容量都存储到一个结构中,以确保两者永远不会分开:
struct ResizeableString {
size_t capacity;
char * str;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.