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

时间:2019-09-15 08:50:55

标签: c malloc memcpy

#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

这意味着仅复制指针字节(4字节)。

我尝试

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

其输出为7

我怎么了?

3 个答案:

答案 0 :(得分:1)

  

这意味着仅复制了指针字节(4字节)。

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

所有内容均被复制。您只是打印前四个字符。更改为:

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

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

答案 1 :(得分:1)

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

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

固定代码:

sizeof(str)

答案 2 :(得分:1)

首先输入错误,然后输入正确的代码: 错误:

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

正确的代码:

#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
}