我应该在分配之前计算所需的内存量吗?

Should I count the required amount of memory before allocating?

考虑使用以下代码过滤掉破折号前缀的参数:

int main(int argc, char* argv[]) {
    int    i;
    int    j;
    size_t flags_len;
    char*  flags;

    flags_len = 0;
    for (i=1; i < argc; i++) {
        if (argv[i][0] == '-') {
            flags_len++;
        }
    }

    flags = malloc(flags_len);

    j = 0;
    for (i=1; i < argc; i++) {
        if (argv[i][0] == '-') {
            flags[j++] = argv[i][1];
        }
    }

    return 0;
}

为了计算标志的数量是否值得遍历所有参数两次?
这样做时保存过滤后元素的位置是否可行?
如果我们期望分配大量内存是否值得?
一般而言,哪种选择是最佳的? (什么是'best practice')?

这没有经过测试——但这样的东西更容易怀孕!

int main(int argc, char* argv[]) {
    int    i;
    int    j;
    int flags_len;
    char*  flags;

    flags_len = 0;
    for (i=1; i < argc; i++) {
        if (argv[i][0] == '-') {
            flags = (char*) malloc((1 + flags_len)*sizeof(char));
            flags[flags_len] = argv[i][1];
            flags_len++;
        }
    }
    free(flags);
    return 0;
}

恕我直言,您没有指定您期望的参数数量。如果您期待成千上万的争论,那肯定不会成为瓶颈。请记住,机器正在做这项工作,而不是你。

在这种情况下,分配和重新分配的效率低于两个循环。另外,如果你害怕双循环,你总是可以分配 flags=malloc(argc).

炭很便宜。我会做这样的事情,

flag = malloc(argc);
//your code
if(argv[i][0]=='-')
flags[j++] = argv[i][1];

为什么?为我节省了两个循环,并将比较减半。 :)