在同一进程中和两个进程之间将字符串从一个指针复制到另一个指针

Posted

技术标签:

【中文标题】在同一进程中和两个进程之间将字符串从一个指针复制到另一个指针【英文标题】:Copy String from one pointer to another in same process and between 2 processes 【发布时间】:2016-09-01 19:21:00 【问题描述】:

所以我在面试中被问到这两个问题-

1-如果我在 C 中有这样的代码 sn-p 会是什么输出

char *ptr1=malloc(10);
ptr1="abc";
char *ptr2 = malloc(20);
ptr2="defghi";
strcpy(ptr1,ptr2);
printf("%s",ptr1);

我回家后在我的终端上尝试了这个,它给出了这个错误

[1]    7673 bus error  ./b.out

我想知道在这种情况下如何将字符串从一个指针复制到另一个指针。

2- 我们有 2 个进程 A 和 B

这是进程A中的代码

char *ptr1=malloc(10);
ptr1="abc";
char *ptr2 = malloc(20);
ptr2="defghi";
strcpy(ptr1,ptr2);

现在ptr1的地址通过进程间通信传递给进程B,进程B中的代码如下(ptr1是进程A的地址)

char *ptr3=malloc(10);
ptr3=ptr1
printf("%s",ptr3);

这会是什么输出?如果 ans 是垃圾值或错误,那么我们如何使 ptr3 指向 ptr1 指向的字符串。

【问题讨论】:

这段代码没有意义。您将内存分配给 ptr1,然后将 ptr1 重新分配给一个常量字符串值。这在内存中的某个地方是固定的。您不能只是将“defghi”复制到 ptr1 中。 他们正在测试你是否知道 C 代码的作用。很明显你没有通过面试。在情况 1 中,您不仅用字符串字面量指针覆盖 malloc 指针,并尝试将一个字符串字面量复制到另一个字面量,而且您要复制到的字符串字面量(即使它是合法的)更小。 @OldProgrammer 我不明白为什么这段代码没有意义。据我说,我们首先为 ptr1 分配了一些空间,然后我们在那个空间中填写了“abc”,我们做了同样的事情ptr2 然后尝试用 ptr2 中存在的内容填充 ptr1 块,然后打印结果。请告诉我哪里出错了。 @KaviKavi 请阅读更多 C 教程和参考资料,您似乎对 C 程序中发生的事情有一个非常模糊的看法。 “为指针分配空间”没有意义。 @unwind 我所说的“为指针分配空间”是指指针指向 malloc 函数给出的内存块的第一个内存位置。如果我错了,请纠正我。 【参考方案1】:

我想知道在这种情况下如何将字符串从一个指针复制到另一个指针。

你不能。指针不包含字符串或其字符。但是,它们可以指向以空字符结尾的字符数组,即字符串。

考虑到这一点,在这里理解这一点很重要:

char *ptr1=malloc(10);
ptr1="abc";

您分配内存块(或尝试这样做),将其地址分配给变量ptr1,然后立即用指向由字符串文字"abc" 表示的数组的指针覆盖该指针值。原始指针值丢失了——你泄漏了那个内存。特别是,赋值绝对不会将文字的字符复制到分配的空间中。

现在请注意,尝试修改字符串文字的任何部分都会调用未定义的行为,无论修改是直接的还是间接的。这个:

strcpy(ptr1,ptr2);

尝试通过指针ptr1 间接修改字符串文字"abc"。如果问题是“输出是什么”,那么这是一个技巧问题。该程序具有未定义的行为——它的输出无法预测,至少不能仅从 C 代码中预测。


IPC 案例是一个不同的技巧问题。指针值仅在获得指针的进程的上下文中才有意义。如果您通过某种形式的 IPC 将该指针传递给不同的进程,则没有理由假设它在接收进程中有效。即使它碰巧是有效的,也不知道它指向什么。如果要将字符串发送到另一个进程,则必须发送 字符,而不是指针。

【讨论】:

以上是关于在同一进程中和两个进程之间将字符串从一个指针复制到另一个指针的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信方式——共享内存

如何在 Windows 中的进程之间传输敏感数据?

两个进程可以共享相同的 GPU 内存吗? (CUDA)

在 Python 进程之间共享一个大的(只读)二进制字符串? [复制]

进程通信之共享内存

Linux 进程间通信 --共享内存