所以我在采访中被问到这两个问题 -
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指向的字符串。
答案 0 :(得分:3)
我想知道如何在这种情况下将字符串从一个指针复制到另一个指针。
你做不到。指针不包含字符串或字符。但是,它们可以指向以空字符结尾的字符数组,即字符串。
考虑到这一点,重要的是要理解这里:
char *ptr1=malloc(10);
ptr1="abc";
分配内存块(或尝试执行),将其地址分配给变量ptr1
,然后立即用指向字符串文字"abc"
表示的arrary的指针覆盖该指针值。原始指针值丢失 - 您泄漏了该内存。特别是,赋值绝对不会将文字的字符复制到分配的空间中。
现在请注意,尝试修改字符串文字的任何部分会调用未定义的行为,无论修改是直接还是间接。这样:
strcpy(ptr1,ptr2);
构成尝试通过指针"abc"
间接修改字符串文字ptr1
。如果问题是“输出是什么”那么这是一个棘手的问题。该程序具有未定义的行为 - 它的输出无法预测,至少不是单独的C代码。
IPC案例是一个不同的技巧问题。指针值仅在获取指针的过程的上下文中有意义。如果通过某种形式的IPC将该指针传递给另一个进程,则没有理由认为它在接收过程中有效。即使它恰好是有效的,也无法说明它指向的是什么。如果要将字符串发送到另一个进程,则必须发送字符,而不是指针。