#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
我怎么了?
答案 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)
首先输入错误,然后输入正确的代码: 错误:
sizeof(str)
来获取字符串的长度。它不适用于指针。而是使用strlen(str) + 1
。malloc
调用的字符串大小中减去1。为什么?您没有为结尾的NULL字符腾出空间。strcpy
而不是memcpy
。如果只需要memcpy
中的附加大小参数,请使用strncpy
。 memcpy
并不是要处理字符串,而是要处理纯数组。char
,而不是unsigned char
。printf("%s", str)
或puts(str)
。为什么要麻烦for循环?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
}