'Invalid pointer' realloc 和 strcat 在 argv 上工作时出错

'Invalid pointer' error with realloc and strcat working on argv

因此,如果程序以选项 -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 业务。我最初在没有临时变量的情况下尝试了整个过程,而是使用了 optstr。这只给了我 "realloc(): invalid pointer" 个错误。我在问 - 为什么会这样,为什么它突然与 temp 一起工作?这是因为 optstr 的指针指向 argv 中的一个参数,更改 argv 会导致错误吗?我真的一点都不确定。

因为你不知道argv里面的字符串内存是怎么分配的。你不应该知道。它们可能是使用 malloc 单独创建的,在这种情况下 realloc 可以工作(但它是不合法的),或者一个大块是 malloc 并且字符串放在块中,在这种情况下,它或其他一些变体将不起作用。

当您在 argv 的指针上调用 realloc 时,您声称您拥有该内存;这是不正确的,您不能重新分配或释放它。另见 Memory allocation and **argv argument

你只能读取内存,所以你能做的,并且已经做了,就是使用strdup创建一个副本;这段记忆是你 拥有的 ,所以现在你可以在上面使用 realloc