Strcat初始化值

时间:2017-10-03 19:08:06

标签: c

我有这样的代码:

char *all_arguments = (char *) malloc(sizeof(char)*argc);

for(int i=1; i<argc; i++) {
    strcat(all_arguments, argv[i]);
}

valgrind输出:

==20425== Conditional jump or move depends on uninitialised value(s)
==20425==    at 0x4C30C0A: strcat (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20425==    by 0x40065B: main (main.c:15)

有什么问题?我知道我应该初始化all_arguments,但是当我执行“all_arguments = NULL;”时我遇到了分段错误。

2 个答案:

答案 0 :(得分:1)

两个问题:

1)您没有为all_arguments分配足够的内存。即使每个参数只是一个字符,您仍然没有字符串终止符的空间。据推测,至少有一些论点更大。

2)由于all_arguments在首次分配时不是字符串,因此您无法将其传递给strcatstrcat的参数必须两者都是字符串。第一次拨打strcat时,all_arguments无效字符串。

答案 1 :(得分:1)

argc保留了函数main我收到的参数数量。

因此,在复制新内存之前,只需重新分配(扩展)内存以便下次输入。

char * all_parameters = malloc(1);

*all_parameters = 0; //Create valid string
for (int i = 1; i < argc; i++) {
    //Extend to new size
    all_parameters = realloc(all_parameters, strlen(all_parameters) + 1 + strlen(argv[i]);
    //Copy together
    strcat(all_parameters, argv[i]);
}

另一种选择是先将所有长度相加,然后只使用malloc一次。

int total_sum=0; // remember to initialize variable 
for (int i = 1; i < argc; i++) {
    total_sum += strlen(argv[i]);
}

char * all_parameters = malloc(total_sum + 1);
*all_parameters = 0;
for (int i = 1; i < argc; i++) {
    strcat(all_parameters, argv[i]);
}