例如,我有以下指示:
srcLen
以下几行有什么区别?
char *ptr;
char *string;
string = malloc(sizeof(char) * 10);
//set string to some word
此外,如果我尝试在其中任何一项任务之后释放“字符串”,是否会出现问题? “ptr”会保留我指定给它的值吗?
答案 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指出的指定字节数(4
或8
)复制到指向的内存块
ptr
。
使用memcpy
和ptr
不同的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
将被视为无效,因为它们都指向同一地址。