在分配指针时,memcpy与仅分配之间有什么区别?

时间:2015-10-05 17:28:57

标签: c pointers variable-assignment

例如,我有以下指示:

srcLen

以下几行有什么区别?

char *ptr;
char *string;

string = malloc(sizeof(char) * 10);
//set string to some word

此外,如果我尝试在其中任何一项任务之后释放“字符串”,是否会出现问题? “ptr”会保留我指定给它的值吗?

3 个答案:

答案 0 :(得分:5)

  

以下几行有什么区别?

ptr = string;
     

VS

memcpy(ptr, string, sizeof(string));

前者指定变量ptr指向string指向的相同位置。后者尝试将sizeof(string)字节从位置string 点复制到到位置ptr。但是,如果ptr尚未初始化为指向足够大的内存块以包含那么多字节,或者根本没有初始化,那么行为是未定义的。

另请注意,sizeof(string)通常不是string类型为char *时所需的字节数。您可能需要strlen(string) + 1,或者您可能想要内存块string的大小(在这种情况下为10)。但sizeof(string)是指针的大小,对于任何指向同一类型的指针都是相同的 - 可能是4或8个字节,具体取决于您的实现。

  

另外,如果我试图在任何一个之后释放“string”,那么会有问题吗?   这些作业? “ptr”仍将保留我指定的值   到?

ptr = string之后,这两个变量指向同一块内存。释放该内存没有固有的问题,你可以通过任何一个指针来完成,但此后你不能尝试取消引用任何一个指针,直到为它指定一个指向可访问内存块的新值。

另一方面,在memcpy()之后,如果完全定义了行为(见上文),则每个指针指向相同数据的单独副本。释放其中一个只释放该副本 - 在这种情况下,仍然可以取消引用另一个副本。

答案 1 :(得分:1)

memcpy(ptr, string, sizeof(string));    // but you will need to allocate memory to ptr

这会将@alk Sir指出的指定字节数(48)复制到指向的内存块 ptr

使用memcpyptr不同的src个内存块。

然而,这 -

ptr = string;

在此ptr指向<{1}}指向的内存块

答案 2 :(得分:0)

ptr = string;ptr&#34;指向&#34;与string

相同的地址

memcpy(ptr,string,sizeof(string))会将string指向的地址中存储的数据复制到ptr指向的地址。 memcpy()只会复制指定的字节数(在您的示例中为10)。

由于ptr未定义,因此您将编写错误。

回答你问题的第二部分。如果您执行memcpy()ptr仍会保留在您free(string)之后复制到其中的数据。在ptr的情况下,ptr = string将被视为无效,因为它们都指向同一地址。