'指针无效'使用realloc和strcat处理argv时出错

时间:2015-11-08 12:58:18

标签: c pointers memory-management arguments realloc

所以我基本上希望我的程序能够将多个(或者在这种情况下,只有两个)参数保存到字符串中,如果程序是使用选项-a启动的话。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>

int main(int argc, char **argv) {

char c;
char *optstr;
int acount = 0;

    while( (c = getopt(argc, argv, "a")) != -1) {

        switch(c) {
            case 'a': acount++; break;
            case '?': fprintf(stderr, "wrong opt\n"); exit(1); break;
            default: assert(0);
        }
    }
    char *temp;
    if(acount == 1) {
        optstr = argv[optind];
        temp = strdup(optstr);
        if(optind+1 < argc) {
            temp = realloc(temp, (strlen(temp) + 1 + sizeof(" ")));
            temp = strcat(temp, " ");
            temp = realloc(temp, (strlen(temp) + 1 + strlen(argv[optind+1])));
            temp = strcat(temp, argv[optind+1]);
        }
    } else {
        fprintf(stderr, "too many or not enough a's\n");
        exit(1);
    }

    fprintf(stdout, "%s\n", temp);
return 0;

}

我的问题在于整个realloc业务正在进行中。我最初尝试了没有temp变量的整个事情,而是使用了optstr。这只给了我&#34; realloc():指针无效&#34;错误。我问 - 为什么会这样,为什么它突然起作用?这是因为optstr的指针指向argv中的参数,更改argv会导致错误吗?我真的不确定。

1 个答案:

答案 0 :(得分:0)

这是因为您不知道如何分配argv内的字符串的内存。你不应该知道。它们可能是使用malloc单独创建的,在这种情况下realloc可以使用(但它不合法),或者大块malloc&d; d和放在块内的字符串,在这种情况下它不会起作用,或者其他一些变体。

当你从realloc的指针上调用argv时,你声称你拥有那个记忆;这不是真的,你不能重新分配或释放它。另请参阅Memory allocation and **argv argument

您只能阅读内存,因此您可以使用strdup来创建副本;这个记忆你然后拥有,所以现在你可以使用realloc