我正在尝试将字符串复制到数组并打印出来。它适用于第一个for循环,但seg第二次出错。
main (int argc, char *argv[]){
int argcIndex;
char **argumentArray = NULL;
for(argcIndex=0; argcIndex < argc; argcIndex++){
argumentArray = (char**) malloc((argc+1)*sizeof(char*));
argumentArray[argcIndex] = (char*) malloc(((strlen(argv[argcIndex])+1)*sizeof(char)));
strcpy(argumentArray[argcIndex], argv[argcIndex]); //Works here
printf("argumentArray[%d]: %s \n", argcIndex, argumentArray[argcIndex]); //Works here
}
for(argcIndex=0; argcIndex < argc; argcIndex++){
//strcpy(argumentArray[argcIndex], argv[argcIndex]); //This gives me a segfault
printf("argumentArray[%d]: %s \n", argcIndex, argumentArray[argcIndex]); //This will only grab the last string in array
}
}
答案 0 :(得分:1)
您需要移动argumentArray
argumentArray = (char**) malloc((argc+1)*sizeof(char*));
在第一个for
循环之外,否则,每次迭代,你都会覆盖(最后,泄漏)内存。
下面的问题是,malloc()
返回未初始化的内存,而在最后一次迭代中,只有一个索引argc-1
正在写,因此其他内容< em> index 仍然不确定。在后面的循环中,当您尝试使用该值时,它会调用undefined behavior。
那就是说,
sizeof(char)
保证在C中为1。没有必要乘以它。malloc()
and family in C
.。而不是malloc()
和strcpy()
,您可以使用strdup()
,如果可以的话。
注意:strdup()
不是标准C函数,FWIW。