我该怎么办才能拥有正确的代码呢?
好的,我更正了下面的代码
摆弄memcpy。 Linux,64位。 gcc 4.8.x
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void d(char ** restrict a, char ** restrict b){
char r[20];
memcpy(r,*a, strlen(*a)+1);
// it is the same thing as before since *c is equivalent to &r (or put simply r).
char *restrict c = malloc(20);
memcpy(c,*a, strlen(*a)+1);
// that one bugs me. why b alone and not *b ??
// EDIT : this is incorrect
memcpy(b,*a, strlen(*a)+1);
// EDIT : this is correct
memcpy(*b,*a, strlen(*a)+1);
printf("pointer c -> hey %s\n",c);
printf("array r -> hey %s\n",r);
// EDIT : this is incorrect
printf("double pointer -> hey %s\n",b);
// EDIT : this is correct
printf("double pointer -> hey %s\n",*b);
}
int main(void)
{
char a[] = "YOU";
char * b = a;
char * c = malloc(20);
d(&b, &c);
return 0;
}
我想不知道为什么memcpy并没有抱怨我将双指针传递给它,而它只需要一个指针。
我知道,使用字符* b ==&amp; a == a并且数组由其第一个成员引用,直到&#39; \ 0&#39;。问题实际上是将一个双指针传递给memcpy。
为什么我不必做
memcpy(*b, *a, strlen(*a)+1);
因为memcpy签名是
void * memcpy ( void * destination, const void * source, size_t num );
和第一个参数是&#34;指向要复制内容的目标数组的指针,根据cplusplus.com类型转换为void *&#34;类型的指针。
什么是&#34; catch&#34;请问好吗?
非常感谢
答案 0 :(得分:2)
好吧,双指针是指向单个指针的单个指针,因此它可以传递给需要void指针的函数。
你的代码是否正确当然是另一回事......它不是巧合而且只能巧合。请注意,您不仅要使用memcpy()写入错误的位置,还要在printf()中打印与字符串相同的错误内存位置。 &#34;巧合&#34;这是这两个&#34;错误&#34;位置是相同的,所以你错误地认为它工作正常。
尝试真正打印正确的东西,你会看到混乱:
printf("double pointer -> hey %s\n",*b);
答案 1 :(得分:2)
考虑如果你想将指针的表示复制到另一个指针会发生什么,如下所示:
char *p;
char *q = NULL;
memcpy(&p, &q, sizeof q);
在这种情况下编译器真的会抱怨吗?的不。强>
重点是void *
是无类型的。它可以指向任何对象类型。它不是void *
无法指向指向指针的约束。它绝对可以。
至于为何&#34;工作&#34;:它不起作用。它似乎只是起作用。由于指针操作无效,代码具有未定义的行为,因此它可以执行任何操作。在更好的情况下,它崩溃并使问题显而易见。在你的情况下,错误保持沉默,程序假装它有效。