所以我基本上希望我的程序能够将多个(或者在这种情况下,只有两个)参数保存到字符串中,如果程序是使用选项-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会导致错误吗?我真的不确定。
答案 0 :(得分:0)
这是因为您不知道如何分配argv
内的字符串的内存。你不应该知道。它们可能是使用malloc
单独创建的,在这种情况下realloc
可以使用(但它不合法),或者大块malloc
&d; d和放在块内的字符串,在这种情况下它不会起作用,或者其他一些变体。
当你从realloc
的指针上调用argv
时,你声称你拥有那个记忆;这不是真的,你不能重新分配或释放它。另请参阅Memory allocation and **argv argument
您只能阅读内存,因此您可以使用strdup
来创建副本;这个记忆你然后做拥有,所以现在你可以使用realloc
。