int main()
带有1个命令行参数:in_filename = argv[1]
(命令行参数示例:inputfile.txt
)。 *in_filename
和*out_filename
都是const char *。我想在out_filename地址写入存储在* in_filename指向的地址中的值。例如,如果* out_filename指向地址(不同于0x7fffffffe930
)上的* in_filname是0x7fffffffe930
“ inputfile.txt”,则将存储“ inputfile.txt”。
int main(int argc, char **argv){
const char *in_filename, *out_filename;
in_filename = argv[1];
out_filename = argv[1];
return 0
}
如果我使用上面的代码,则out_filename将与in_filename具有相同的地址,但我希望他使用与in_filename指向的地址中存储的地址不同的地址和相同的值(inputfile.txt)。
如果我使用
int main(int argc, char **argv){
const char *in_filename, *out_filename;
in_filename = argv[1];
strcpy(out_filename, in_filename);
return 0
}
我在调试器中收到错误消息:out_filename的地址为0x40000,但访问它时出错,程序停止。 in_filename有一个地址,并在其中存储了正确的值。此任务的正确代码是什么?
答案 0 :(得分:1)
您要查询的代码是:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
const char *in_filename;
char *out_filename;
in_filename = argv[1];
out_filename = malloc(strlen(in_filename)+1);
strcpy(out_filename, in_filename);
printf("%s\n", in_filename);
printf("%s\n", out_filename);
return 0;
}
函数strcpy
将char *
作为目的地,而不是strcpy中的const char *
。
答案 1 :(得分:0)
我认为你很困惑。
此处,argv[1]
是一个指针,指向操作系统分配的内存区域,在该内存中它将复制传递给程序的第一个参数。当您执行in_filename = argv[1];
时,您使in_filename
指向相同的内存区域。
现在,out_filename
还是一个指针,但是最初它并不指向任何地方。如果您执行in_filename = argv[1];
,则这两个指针均指向由OS分配的先前提到的内存区域,因此您的副本将没有任何意义。但这当然是合法的,您可以执行strcpy(out_filename, in_filename)
。
如果您想out_filename
指向另一个有效的内存区域,则需要为其分配内存,或者在堆栈上使用:
char out_filename[strlen(argv[1]) + 1];
或在堆上使用:
out_filename = malloc(strlen(argv[1]) + 1);
然后使用strcpy(out_filename, in_filename)
进行复制!