Strcat初始化值
我有这样的代码:Strcat初始化值,c,C,我有这样的代码: char *all_arguments = (char *) malloc(sizeof(char)*argc); for(int i=1; i<argc; i++) { strcat(all_arguments, argv[i]); } 怎么了?我知道我应该初始化所有的参数,但是当我执行“all_arguments=NULL”时,我遇到了一个分段错误。两个问题: 1) 您没有为所有参数分配足够的内存。即使每个参数只是一个字符,您仍然没有空间来放置字符串终止符
char *all_arguments = (char *) malloc(sizeof(char)*argc);
for(int i=1; i<argc; i++) {
strcat(all_arguments, argv[i]);
}
怎么了?我知道我应该初始化所有的参数,但是当我执行“all_arguments=NULL”时,我遇到了一个分段错误。两个问题:
1) 您没有为所有参数分配足够的内存。即使每个参数只是一个字符,您仍然没有空间来放置字符串终止符。据推测,至少有一些论据更大
2) 由于第一次分配时,所有参数
不是字符串,因此不能将其传递给strcat
。strcat
的参数必须都是字符串。第一次调用strcat时,所有参数都是无效字符串。有两个问题:
1) 您没有为所有参数分配足够的内存。即使每个参数只是一个字符,您仍然没有空间来放置字符串终止符。据推测,至少有一些论据更大
2) 由于第一次分配时,所有参数
不是字符串,因此不能将其传递给strcat
。strcat
的参数必须都是字符串。第一次调用strcat时,所有参数都是无效字符串。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]);
}
char*all_参数=malloc(1);
*所有_参数=0//创建有效字符串
对于(int i=1;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]);
}
int total\u sum=0;//记得初始化变量
对于(int i=1;i
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]);
}
char*all_参数=malloc(1);
*所有_参数=0;//创建有效字符串
对于(int i=1;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]);
}
int total\u sum=0;//记得初始化变量
对于(int i=1;i
您忘记为每个参数分配内存。在for-loop之前需要*all_arguments=0;
。而argc
是参数的数量,而不是它们的总长度。因此您的all_arguments
缓冲区太小了。@MartinJames NO!所有参数的长度通常不限于1024个字符,这就是您使用c的方式ode不必要的错误。这不是你要问的,但我觉得值得一提的是,重复使用这样的strcat是一个低效Schlemiel the Painter算法的教科书示例。你忘记了为每个参数分配内存。在for-loop之前需要*all_arguments=0;
。而argc
是参数的数量nts,不是它们的总长度。所以你的所有参数的缓冲区太小了。@MartinJames不!所有参数的长度通常不限于1024个字符,这就是你编写不必要的错误的方式。这不是你要问的,但我觉得值得一提的是,像这样重复使用strcat是t的一个教科书示例他对画师算法施莱米尔的效率很低。@MarcusMüller我们不是在讨论最差/最好的,我们是在讨论如何求解。最好先把所有长度相加,但这并不意味着它是错的。@MarcusMüller很容易理解,我认为这是一个加号。相反,你应该把所有的strlen(argv[I])相加
,malloc
将所有参数重新分配一次(从未重新分配过),然后将所有参数一起重新分配。我认为这不容易理解(花了我很长时间),但“很容易”可能与您的期望非常相关。请注意,realloc
@MarcusMüller这就是我刚才说的。杰普,我们同时写了我们的评论。你得到了我的支持!@MarcusMüller我们不是在谈论最坏/最好的,我们是在讨论如何解决。最好是先把所有长度相加,但事实并非如此这并不意味着它是错的。@MarcusMüller这很容易理解,但我认为这是一个加号。相反,你应该把所有的strlen(argv[I])
,malloc
“将所有参数都加一次(从未重新分配过),然后strcat
加在一起。我认为这不容易理解(花了我很长时间),但“很容易”可能与您的期望非常相关。请注意,realloc
@MarcusMüller这是我刚才说的。杰普,我们同时写了我们的评论。你得到了我的支持!