malloc遇到的问题(strlen(char*)&x2B;1)

malloc遇到的问题(strlen(char*)&x2B;1),c,C,下面是一个小测试,以解决我在使用C编程时的困惑 int main() { char buff[100] = {}; char* pStr = NULL; printf("Input the string\n"); if (!fgets(buff, sizeof(buff), stdin)) { printf("ERROR INPUT\n"); return 1; } printf("%zd\n", strl

下面是一个小测试,以解决我在使用C编程时的困惑

int main()
{
    char buff[100] = {};
    char* pStr = NULL;

    printf("Input the string\n");
    if (!fgets(buff, sizeof(buff), stdin))
    {
        printf("ERROR INPUT\n");
        return 1;
    }
    printf("%zd\n", strlen(buff));
    pStr = (char*)malloc(strlen(buff)+1);
    strcpy_s(pStr, sizeof(buff), buff);
    printf("%s\n", strlen(pStr));

    return 0;
}
我尝试使用
fgets
捕获输入字符串并将其存储在
malloc
分配的内存中。但是,当我尝试使用
malloc(strlen(char*)+1)
时,程序编译时没有bug,但运行失败。一旦我切换到malloc(sizeof(buff)),它就可以正常工作了。我很困惑。因此,搜索您的帮助。

strcpy_s(pStr,sizeof(buff),buff)不正确,应使用新目标缓冲区的大小,而不是源缓冲区的大小

把整个东西换成

size_t size = strlen(buff)+1;
pStr = malloc(size);
memcpy(pStr, buff, size);
作为一个小小的奖励,这个代码也更快。

strcpy_s(pStr,sizeof(buff),buff)不正确,应使用新目标缓冲区的大小,而不是源缓冲区的大小

把整个东西换成

size_t size = strlen(buff)+1;
pStr = malloc(size);
memcpy(pStr, buff, size);

作为一个小的奖励,这个代码也更快。

你使用C还是C++?对于这两种语言,您都有问题。这看起来像是删除了与您的问题无关的,但是看看对
malloc
的调用,您分配了多少字节?然后看一看下一行的strcpy调用,您可以在那里复制多少字节?
strcpy_s
调用中的长度是目标缓冲区的大小。PS:您不需要在
malloc
上强制转换,您的意思肯定是
printf(“%s\n”,pStr)。我推荐
printf(“\n”,pStr)清楚地看到引导/拖尾空白。你使用C还是C++?对于这两种语言,您都有问题。这看起来像是删除了与您的问题无关的,但是看看对
malloc
的调用,您分配了多少字节?然后看一看下一行的strcpy调用,您可以在那里复制多少字节?
strcpy_s
调用中的长度是目标缓冲区的大小。PS:您不需要在
malloc
上强制转换,您的意思肯定是
printf(“%s\n”,pStr)。我推荐
printf(“\n”,pStr)以清楚地看到前导/尾随空格。Lundin,感谢您的帮助。可以安全地说,当将字符串从缓冲区复制到memroy区域时,memcpy比strcpy_s好吗?@xiaoshi当您知道字符串的长度时,请使用memcpy,因为它最快。如果您不知道字符串的长度,可以使用strcpyu.Lundin,谢谢您的帮助。可以安全地说,当将字符串从缓冲区复制到memroy区域时,memcpy比strcpy_s好吗?@xiaoshi当您知道字符串的长度时,请使用memcpy,因为它最快。当您不知道字符串的长度时,可以使用strcpy_s。