从字符串

时间:2017-10-26 02:37:38

标签: 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++;
}

假设已将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格式说明符。

1 个答案:

答案 0 :(得分:1)

strlen用于了解字符串中存储的有用字符数。为此,它计算在查看终止字符串npm install --save-dev babel-loader babel-core babel-preset-env webpack and inside your webpack config: module: { rules: [ { test: /\.js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader', options: { presets: ['env'] } } } ] } (sentinel)的NULL char之前设置了多少个char。

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

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

malloc