【问题标题】:When assigning pointers, what is the difference between a memcpy and just assigning?分配指针时,memcpy 和仅分配有什么区别?
【发布时间】:2015-10-05 17:28:56
【问题描述】:

例如,我有以下指针:

char *ptr;
char *string;

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

以下几行有什么区别?

ptr = string;

vs.

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

另外,如果我在完成这些任务后尝试释放“字符串”会不会有问题? “ptr”还会保留我分配给它的值吗?

【问题讨论】:

  • 指针和指针的区别。

标签: c pointers variable-assignment


【解决方案1】:

以下几行有什么区别?

ptr = string;

对比

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

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

还要注意,当string 的类型为char * 时,sizeof(string) 通常不是您想要的字节数。您可能想要strlen(string) + 1,或者您可能想要string 指向的内存块的大小(在本例中为10)。但是sizeof(string) 是指针的大小,对于任何指向相同类型的指针来说都是相同的——可能是 4 或 8 个字节,具体取决于您的实现。

另外,如果我尝试在其中任何一个之后释放“字符串”会不会有问题 这些作业? “ptr”是否仍会保留我分配给它的值 去?

ptr = string 之后,两个变量指向同一个内存块。释放该内存并没有固有的问题,您可以通过任一指针来执行此操作,但此后您不得尝试取消引用任一指针,直到您为其分配一个指向可访问内存的新值。

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

【讨论】:

    【解决方案2】:
    memcpy(ptr, string, sizeof(string));    // but you will need to allocate memory to ptr
    

    这会将指定字节数(@alk Sir 指出的48 字节)复制到由 ptr.

    使用ptrsrc 不同的memcpy 内存块。

    然而,这 -

    ptr = string;
    

    在这个ptr 中指向string 指向的内存块

    【讨论】:

    【解决方案3】:

    ptr = string; 将使ptr“指向”与string 相同的地址

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

    由于ptr 未定义,后者将导致您编写的错误。

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

    【讨论】:

    • "... 复制指定的字节数(在您的示例中为 10)。" 不,它复制 4 或 8 个字节,具体取决于是否在 32 或64 位平台。指针不是数组。
    • @alk,我认为这意味着在普通 linux/windows 系统上的普通 char 字符串的上下文中,它实际上将从位置 string 开始复制 sizeof(string) 字节到位置ptr
    • @SamuelAllan: sizeof x always 返回变量x的大小,如果x被定义为一个指针(likechar * x;) 那么这个大小通常是 4 或 8 个字节,no 不管指针指向什么。要查找 C-“字符串”的长度,请使用 strlen()
    • @alk 显然我误读了他的代码。是的,你是对的。我还以为是strlen(其实谁知道我以为我明显看不懂)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2014-01-26
    • 1970-01-01
    • 2011-03-20
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多