【问题标题】:Passing parameters, pointer and adress problem传递参数、指针和地址问题
【发布时间】:2011-09-21 08:37:21
【问题描述】:

我在将参数传递给函数时遇到了一些问题。示例:

#include <iostream>
using namespace std;

struct VShop
{
    bool index;
    char *fName;
    char *edName;
    char *genre1;
    char *genre2; 
    double rating;
    double price;
};

void AddtoDB (VShop *Film, char *name, char *ed, char *genre1, char *genre2, double rating, double price, int *size, int *element);

int main()
{
    int size = 0, element = 0;
    VShop *Film = new VShop[size];

    AddtoDB(Film, "The Shawshank Redemption", "Frank Darabont", "Crime", "Drama", 9.2, 20, &size, &element);

    cout<<size; // ERROR!

    return 0;
}

void AddtoDB (VShop *Film, char *name, char *ed, char *genre1, char *genre2, double rating, double price, int *size, int *element)
{
    *size++;
    Film[*element].fName = name;
    Film[*element].edName = ed;
    Film[*element].genre1 = genre1;
    Film[*element].genre2 = genre2;
    Film[*element].rating = rating;
    Film[*element].price = price;
    *element=(*element+1);
}

每次我想获得sizeelement 时都会出错。它会发生什么?谢谢。

【问题讨论】:

  • 一个明显的错误是您正在通过VShop *Film = new VShop[size] 创建一个空指针。由于size==0,您根本不分配任何内存(我什至不确定new Foo[0] 的定义是否明确)。如果您在任何情况下都使用 C++,为什么不为您的数据库使用向量?
  • 谢谢,它成功了。只需要重写我的功能。而且我对向量一无所知,因为我刚开始学习 C++。再次感谢。

标签: c++ pointers parameter-passing


【解决方案1】:

您的代码有几个错误。首先:

VShop *Film = new VShop[size];

size0,当您尝试访问它时,它可能会失败并且不起作用。

其次:

*size++;

++ 的优先级高于*,因此它的计算结果为:

*(size++);

while 增加 size,然后取消引用 size 的 old 值。你可能想要:

(*size)++;

增加size指向的int的值。

【讨论】:

    【解决方案2】:

    你的内存有很大问题。看:

    您创建了大小为零的数组:

    VShop *Film = new VShop[size];
    

    然后你尝试增大大小变量但没有改变数组大小:

    *size++; //must be (*size)++;
    

    数组的长度仍然为零,但您正在尝试更改第一个(零)元素的一些数据:

    Film[*element].fName = name;
    

    你必须在插入新元素之前调整数组的大小:

    1. 创建大小合适的新数组;
    2. 将所有数据从旧数组复制到新数组;
    3. 删除旧数组;
    4. 用新数组替换指向旧数组的指针。

    另一个变种是使用 std::vector。

    不管怎样,读一些关于c++内存管理的书,和c++。

    【讨论】:

      【解决方案3】:

      因为 ++ 的优先级高于 *,所以这个表达式是 相当于*(大小++)。因此,它所做的就是增加价值 大小(所以它现在指向下一个元素),但是因为 ++ 被用作 后缀整个表达式被评估为由指向的值 原始引用(指针指向之前的地址 增加)。

      尝试使用just;

      (*size)++;
      

      这将导致表达式被评估为 size 所指向的值增加一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-19
        • 1970-01-01
        • 2022-01-15
        • 2020-01-09
        • 1970-01-01
        • 2011-10-12
        • 2011-11-10
        • 2019-05-11
        相关资源
        最近更新 更多