【问题标题】:How to assign to the address of a pointed pointer the value stored at the address pointed by another pointer? [duplicate]如何将存储在另一个指针指向的地址的值分配给指向指针的地址? [复制]
【发布时间】:2019-08-08 08:01:52
【问题描述】:

int main() 采用 1 个命令行参数:in_filename = argv[1](命令行参数示例:inputfile.txt)。 *in_filename*out_filename 都是 const char *。我想将存储在 *in_filename 指向的地址中的值写入 out_filename 地址。例如,如果 *in_filname 是 0x7fffffffe930,“inputfile.txt”在 *out_filename 指向的地址(不同于 0x7fffffffe930)将存储“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 有一个地址和存储在其中的正确值。此任务的正确代码是什么?

【问题讨论】:

  • 请向我们展示您目前拥有的完整代码。并且更具体地说明您的问题:它是否打开了您未指定名称的文件?或者以特定格式写入指针的值(到文件)?
  • 是否要复制指针,如out_filename = in_filename?还是要将in_filename 的内容复制到out_filename 指向的位置(在您将其指向某处之后),如strcpy(out_filename, in_filename) 中的那样?
  • 谢谢,我想完成第二个变体: o 将 in_filename 的内容复制到 out_filename 指向的位置(在你让它指向某个地方之后),如 strcpy(out_filename, in_filename)。跨度>
  • 附带说明,C 语言实际上允许您对 argv[1] 的内存区域进行写访问,但您不能更改那里分配的内存区域的大小。又一个 C 语言怪事。

标签: c pointers memory dereference


【解决方案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 * 作为目标,而不是const char *,见strcpy

【讨论】:

  • 谢谢! out_filename 必须具有 const char* 的格式,所以我更改了 out_filename = (char *) malloc(strlen(in_filename)+1); to out_filename = (const char *) malloc(strlen(in_filename)+1);
  • " out_filename 的格式必须为 const char"* - 不,不是。您可以将其传递给任何需要 const char* 的函数。此外,虽然在这段代码中无关紧要,但通常你 free 完成后你 malloc 的内容。
  • 对我写的代码的要求必不可少:)再次感谢!
【解决方案2】:

我认为你完全糊涂了。

这里,argv[1] 是一个指针,它指向由操作系统分配的内存区域,它复制传递给程序的第一个参数。当您执行in_filename = argv[1]; 时,您使in_filename 指向同一内存区域。

现在,out_filename 也是一个指针,但它最初并不指向任何地方。如果您执行in_filename = argv[1];,那么这两个指针都指向前面提到的操作系统分配的内存区域,因此您的副本将毫无意义。但这当然是合法的,您可以发送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) 复制您的副本!

【讨论】:

  • strlen(argv[1]) + 1
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多