【问题标题】:Pointer Arithmetic on structs结构上的指针算术
【发布时间】:2014-11-11 21:50:28
【问题描述】:

我正在研究一些C代码,当我遇到了以下sn-p:

struct example *example_clone(struct example *ex)
{  
    struct example *new_ex;  
    new_ex = ex + 1;    // How does this works ?    
    ....  
    new_ex = some_func(...);  //makes new_ex as struct example
    ....  
}  

现在考虑new_ex = ex + 1;
new_ex 是在内存中的 ex 之后吗?
如果内存中ex 之后存在其他对象怎么办。换了吗?

【问题讨论】:

  • 使用指针算法,+1 表示 + sizeof(struct example)
  • 如果输入指针ex指向一个结构体数组,那么ex+1指向数组中的下一个结构体。但是如果ex 指向一个单独的结构,那么ex+1 就不会指向任何有用的东西。
  • new_ex = ex + 1; 表示new_ex = &ex[1];

标签: c++ c pointers memory-management


【解决方案1】:

该函数应使用struct example 对象的数组来调用。

例如:

struct example bla[2] = { /* initializers */ };

example_clone(bla);  // OK, bla[1] will be overwritten

这没关系,因为ex + 1 指向一个现有对象。

但是传递一个指向对象而不是数组元素的指针是不行的:

struct example blo = { /* initializers */ };

example_clone(&blo);  // Not OK, the object at &blo + 1 will be overwritten

这不行,因为ex + 1 不指向现有对象。函数执行将调用未定义的行为。

【讨论】:

    【解决方案2】:

    1 添加到指针意味着指向下一个元素`。请记住,指针指向特定类型的对象(它们不仅仅是编号的内存位置)。

    例如,如果您指向停车场中的第一辆车,那么 +1 表示您指向第二辆车。

    如果那里实际上没有其他对象,那很好,C 有一种特殊情况,您可以将一个指向现有对象的末尾。但是如果你再次+1 会导致未定义的行为。

    如果您尝试读取该指针并且那里没有对象,则会导致未定义的行为。只要您正在写入分配给您的内存,您就可以通过指针写入。

    【讨论】:

      【解决方案3】:

      new_ex 是否在内存中的 ex 之后?

      是的。它指向刚刚超过ex 结尾的内存地址。

      如果内存中的 ex 之后存在其他对象怎么办。换了吗?

      会发生两件事中的一件。首先,它可以覆盖那里的对象。其次,如果该内存不可用,它可能会出现段错误。出于这个原因,我认为这个功能很危险。我将手动内联此代码,以便您可以验证 ex + 1 的内容/存在。

      【讨论】:

        猜你喜欢
        • 2016-07-30
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多