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

use*_*478 0 c pointers variable-assignment

例如,我有以下指针:

char *ptr;
char *string;

string = malloc(sizeof(char) * 10);
//set string to some word
Run Code Online (Sandbox Code Playgroud)

以下几行有什么区别?

ptr = string;

vs.

memcpy(ptr, string, sizeof(string));
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ger 5

以下几行有什么区别?

ptr = string;
Run Code Online (Sandbox Code Playgroud)

memcpy(ptr, string, sizeof(string));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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