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这是我刚才说的。杰普,我们同时写了我们的评论。你得到了我的支持!