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"仍会保留我指定给它的值吗?
以下几行有什么区别?
Run Code Online (Sandbox Code Playgroud)ptr = string;与
Run Code Online (Sandbox Code Playgroud)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个字节,具体取决于您的实现.
此外,如果我尝试在这些任务中的任何一个之后释放"字符串",是否会出现问题?"ptr"仍会保留我指定给它的值吗?
之后ptr = string,这两个变量指向同一块内存.释放该内存没有固有的问题,你可以通过任何一个指针来完成,但是此后你不能尝试取消引用任何一个指针,直到为它指定一个指向可访问内存块的新值.
在后memcpy(),在另一方面,如果该行为是在所有定义的(见上文),则每个指针指向相同数据的一个单独的副本.释放其中一个只释放该副本 - 在这种情况下,仍然可以取消引用另一个副本.