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

时间:2016-09-01 19:21:00

标签: c pointers ipc

所以我在采访中被问到这两个问题 -

1 - 如果我在C中有这样的代码片段将是什么输出

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指向的字符串。

1 个答案:

答案 0 :(得分:3)

  

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

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

考虑到这一点,重要的是要理解这里:

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

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

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

strcpy(ptr1,ptr2);

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

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