如何为指向指针的地址分配存储在另一个指针指向的地址处的值?

时间:2019-08-08 08:01:52

标签: c pointers memory dereference

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有一个地址,并在其中存储了正确的值。此任务的正确代码是什么?

2 个答案:

答案 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;
}

函数strcpychar *作为目的地,而不是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)进行复制!

相关问题