为什么我可以给C中的指针分配一个更长的字符串? #包括 #包括 int main() { char*ptr=malloc(sizeof(char)*1); ptr=“你好,世界”; 看跌期权(ptr); getchar(); }

为什么我可以给C中的指针分配一个更长的字符串? #包括 #包括 int main() { char*ptr=malloc(sizeof(char)*1); ptr=“你好,世界”; 看跌期权(ptr); getchar(); },c,string,pointers,memory,malloc,C,String,Pointers,Memory,Malloc,我不是malloc()专家,但由于我只分配了一个字节,但为*ptr指针分配了一个包含11个字节的值,所以该代码不应该给出错误吗? 或者H是否存储在我分配的位置,然后字符串的其余部分只是在后面的位置?您正在将指针“ptr”重新分配给另一块内存,这样您将不会看到任何错误。但是,您分配的内存块(大小1)已“丢失”,并导致内存泄漏。您正在将指针“ptr”重新分配给另一个内存块,因此不会看到任何错误。但是,您分配的内存块(大小1)已“丢失”,并导致内存泄漏。使用malloc时,您正在请求一些内存,并且ma

我不是malloc()专家,但由于我只分配了一个字节,但为*ptr指针分配了一个包含11个字节的值,所以该代码不应该给出错误吗?

或者H是否存储在我分配的位置,然后字符串的其余部分只是在后面的位置?

您正在将指针“ptr”重新分配给另一块内存,这样您将不会看到任何错误。但是,您分配的内存块(大小1)已“丢失”,并导致内存泄漏。

您正在将指针“ptr”重新分配给另一个内存块,因此不会看到任何错误。但是,您分配的内存块(大小1)已“丢失”,并导致内存泄漏。

使用
malloc
时,您正在请求一些内存,并且
malloc
返回该内存的第一个地址(如果可以提供)。重新分配指针时,指针指向的内存中没有任何操作。您只需更改指针指向的内容


您在这里所做的操作在技术上是有效的,但是您正在创建一个内存泄漏,因为您丢失了
malloc
ed内存的地址,您必须
释放它

使用
malloc
时,您正在请求一些内存,并且
malloc
返回该内存的第一个地址(如果可以提供)。重新分配指针时,指针指向的内存中没有任何操作。您只需更改指针指向的内容


您在这里所做的操作在技术上是有效的,但是您正在创建一个内存泄漏,因为您丢失了
malloc
ed内存的地址,您必须
释放它

这不是您的代码,否则您将得到一个错误,因为
(char*)ptr
不是左值,那么这是指针赋值;它不会复制任何数组的内容。但请更新您的问题,以显示您实际编译的代码(复制并粘贴它,不要重新键入)
sizeof(char)
定义为1。。。数学告诉我们,任何乘以1的结果都是相同的。这里有两个冗余级别。只需使用
malloc(1)
。这不是您的代码,否则您将得到一个错误,因为
(char*)ptr
不是左值。如果您实际编写了
ptr=“Hello World”,那么这是指针赋值;它不会复制任何数组的内容。但请更新您的问题,以显示您实际编译的代码(复制并粘贴它,不要重新键入)
sizeof(char)
定义为1。。。数学告诉我们,任何乘以1的结果都是相同的。这里有两个冗余级别。只需使用
malloc(1)
。是的,这是正确的。如果您想看到预期的错误,请尝试使用
memcpy(ptr,“Hello World”)
,它将尝试将11个字节写入分配给ptr的内存。@austin:那就是UB。你不一定会出错。是的,这是正确的。如果您想看到预期的错误,请尝试使用
memcpy(ptr,“Hello World”)
,它将尝试将11个字节写入分配给ptr的内存。@austin:那就是UB。你不一定会出错。
#include <stdio.h> 
#include <stdlib.h>

int main()
{
    char *ptr = malloc(sizeof(char) * 1);
    ptr = "Hello World";

    puts(ptr);
    getchar();
}