Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C指针数组不能与memcpy一起使用_C_Array Pointer - Fatal编程技术网

C指针数组不能与memcpy一起使用

C指针数组不能与memcpy一起使用,c,array-pointer,C,Array Pointer,我想用memcpy连接两个字符串。但下一个memcpy不起作用。我的预期输出是“我的名字是汗” #包括 #包括 #包括 int main() { char*var1=“我的名字”; char*var2=“is khan”; char*f_add[20]; memcpy(f_add,var1,strlen(var1)+1); memcpy(f_add+8,var2,strlen(var2)+1); printf(“%s”,f_add); 返回0; } 指针数组仅保存字符串文本的地址(引用)。你的代

我想用memcpy连接两个字符串。但下一个memcpy不起作用。我的预期输出是“我的名字是汗”

#包括
#包括
#包括
int main()
{
char*var1=“我的名字”;
char*var2=“is khan”;
char*f_add[20];
memcpy(f_add,var1,strlen(var1)+1);
memcpy(f_add+8,var2,strlen(var2)+1);
printf(“%s”,f_add);
返回0;
}

指针数组仅保存字符串文本的地址(引用)。你的代码毫无意义

int main(void)
{
    char *var1 = "my name";
    char *var2= "is khan";
    char *f_add[20];

    f_add[0] = var1;
    f_add[1] = var2;
    printf("%s\n%s", f_add[0], f_add[1]);
    return 0;
}
或者您需要为字符串分配空间

int main(void)
{
    char *var1 = "my name";
    char *var2= "is khan";
    char *f_add[20];

    f_add[0] = malloc(strlen(var1) + 1);
    f_add[1] = malloc(strlen(var2) + 1);

    memcpy(f_add[0],var1, strlen(var1)+1);
    memcpy(f_add[1],var2, strlen(var2)+1);

    printf("%s\n%s", f_add[0], f_add[1]);
    return 0;
}

C语言或多或少是一种低级语言,因此您必须自己操作内存

例如:

char *var1 = strdup("my name");
char *var2 = strdup(" is kahn");
memcpy(&var1[7],var2, strlen(var2)+1);
strdup是一个C函数,用于自动将指针malloc为给定字符串的大小。 然后将字符串复制到指针中


一旦它们都是malloced(或者至少是var1),您就可以使用memcpy将它们连接在一行中。

char*f_add[20]
定义一个包含两个指向
char
的指针的数组。您可能需要一个包含20个字符的简单数组:

char f_add[20];
然后你需要复制到正确的地方。复制到f_add+8开始在标记第一个字符串结尾的空字节后写入,因为该字符串“my name”有七个非空字符和一个空终止符。因此,您需要在空字符上开始复制:

memcpy(f_add+7, var2, strlen(var2)+1);

您还可以使用
memcpy(f_add+strlen(f_add),var2,strlen(var2)+1)
,尽管这实际上是strcpy(f_add,var2)所做的。

指针需要内存使用
malloc
,用于
f_add
char*f_add[20]
不是进行连接的正确方法为什么
memcpy
而不是
strcpy
&
strcat
<代码>strcpy(f_add,var1);strcat(f_add,var2)(并正确定义
f_add
)。PS:你的问题(其中之一)是
+8
-你需要
+7
,因为8超过了零,即第二个字符串被忽略。我猜他们的意思是
char f_add[20]
,把它变成一个指针数组是偶然的,或者是一个误解。你的例子是写过分配字符串的末尾(var1),它是8号的。您可能希望将大小为
strlen(var1)+strlen(var2)+1
的对象作为目标。此代码错误地访问内存。您已将一个8字节的字符串分配到var1中,并尝试使用memcpy将其写入过去。不好:)你的解释是正确的,很有帮助。谢谢
memcpy(f_add+7, var2, strlen(var2)+1);