我有这样的代码:
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;”时我遇到了分段错误。
答案 0 :(得分:1)
两个问题:
1)您没有为all_arguments
分配足够的内存。即使每个参数只是一个字符,您仍然没有字符串终止符的空间。据推测,至少有一些论点更大。
2)由于all_arguments
在首次分配时不是字符串,因此您无法将其传递给strcat
。 strcat
的参数必须两者都是字符串。第一次拨打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]);
}