简单的字符串复制,但 memcpy 不起作用

simple string copy, but memcpy doesn't work

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{
    unsigned char str[] = "abcdefg";
    unsigned char *str1 = (unsigned char*)malloc(sizeof(str) -1);

    memcpy(str1, str, (sizeof(str)-1) );

    for(int i = 0; i<(sizeof(str1)); i++)
        printf("%c", str1[i]);

    free(str1);
}

我想将字符串 str 复制到 str1 但输出是

abcd

表示只复制指针byte(4byte)。

然后我尝试

printf("%d", sizeof(str)-1 );

它的输出是7

我的错误是什么?

it mean that only pointer byte(4byte) is copied.

不,不是。您假设您的打印输出是正确的,但事实并非如此。您可以在数组上使用 sizeof 但不能在指针上使用。嗯,你可以,但这意味着不同的东西。

全部复制。您只是打印前四个字符。更改为:

for(int i = 0; i<(sizeof(str) - 1); i++)

此外,不要强制转换 malloc。原因如下:Do I cast the result of malloc?

str1 是一个指针,而 str 是一个字符数组。当您在 for 循环中说 sizeof(str1) 时,它会迭代 4 次,因为 sizeof(str1) 必须计算为 4(32 位编译器),而 sizeof(str) 计算为正确的长度。

您应该阅读 What is the size of a pointer? 一次以了解有关指针大小的更多信息。

固定码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{
    unsigned char str[] = "abcdefg";
    unsigned char *str1 = (unsigned char*)malloc(sizeof(str) -1);

    memcpy(str1, str, (sizeof(str)-1) );

    for(int i = 0; i<(sizeof(str) - 1); i++)
        printf("%c", str1[i]);

    free(str1);
}

先是错误再是正确的代码: 错误:

  1. 永远不要使用 sizeof(str) 来获取字符串的长度。它不适用于指针。相反,使用 strlen(str) + 1.
  2. 您正在从 malloc 调用的字符串大小中减去 1。为什么?您没有为结尾的 NULL 字符制作 space。
  3. 复制字符串时,如果您知道目标字符串足够大以存储源字符串,请使用 strcpy 而不是 memcpy。如果您只需要一个额外的大小参数,例如 memcpy,请使用 strncpymemcpy 不是要处理字符串,而是要处理普通数组。
  4. 用于字符串的正确类型是 char,而不是 unsigned char
  5. 不是真正的错误,但要打印字符串,您可以使用 printf("%s", str)puts(str)。为什么要使用 for 循环?
  6. void main() 被 C 标准禁止。

正确代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char str[] = "abcdefg";
    char str1* = malloc(strlen(str) + 1);
    strcpy(str1, str);
    puts(str1);
    free(str1);
    //return 0; - default in C99 and later
}