在同一进程中和两个进程之间将字符串从一个指针复制到另一个指针
Copy String from one pointer to another in same process and between 2 processes
所以我在面试中被问到这两个问题-
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 指向的字符串。
I would like to know how to copy the string in such a case from one pointer to another.
你不能。指针不包含字符串或它们的字符。但是,它们可以指向 以 null 结尾的字符数组,即字符串。
考虑到这一点,重要的是要了解这里:
char *ptr1=malloc(10);
ptr1="abc";
您分配内存块(或尝试这样做),将其地址分配给变量 ptr1
,然后立即用指向由字符串文字 "abc"
表示的数组的指针覆盖该指针值.原来的指针值丢失了——你泄漏了那个内存。特别是,赋值绝对不会将文字的字符复制到分配的 space.
现在请注意,尝试修改字符串文字的任何部分都会引发未定义的行为,无论修改是直接的还是间接的。这个:
strcpy(ptr1,ptr2);
试图通过指针 ptr1
间接修改字符串文字 "abc"
。如果问题是 "what is the output" 那么这是一个技巧问题。该程序具有未定义的行为 -- 它的输出无法预测,至少不能单独从 C 代码中预测。
IPC 案例是一个不同的技巧问题。指针值仅在获取指针的进程上下文中才有意义。如果您通过某种形式的 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 指向的字符串。
I would like to know how to copy the string in such a case from one pointer to another.
你不能。指针不包含字符串或它们的字符。但是,它们可以指向 以 null 结尾的字符数组,即字符串。
考虑到这一点,重要的是要了解这里:
char *ptr1=malloc(10);
ptr1="abc";
您分配内存块(或尝试这样做),将其地址分配给变量 ptr1
,然后立即用指向由字符串文字 "abc"
表示的数组的指针覆盖该指针值.原来的指针值丢失了——你泄漏了那个内存。特别是,赋值绝对不会将文字的字符复制到分配的 space.
现在请注意,尝试修改字符串文字的任何部分都会引发未定义的行为,无论修改是直接的还是间接的。这个:
strcpy(ptr1,ptr2);
试图通过指针 ptr1
间接修改字符串文字 "abc"
。如果问题是 "what is the output" 那么这是一个技巧问题。该程序具有未定义的行为 -- 它的输出无法预测,至少不能单独从 C 代码中预测。
IPC 案例是一个不同的技巧问题。指针值仅在获取指针的进程上下文中才有意义。如果您通过某种形式的 IPC 将该指针传递给另一个进程,则没有理由假设它在接收进程中有效。即使它恰好是有效的,也不知道它指向什么。如果要将字符串发送到另一个进程,则必须发送 个字符 ,而不是指针。