2011-09-21 16 views
-2

我有一些传递参数到函数的问题。例如:传递参数,指针和地址问题

#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。它发生了什么?谢谢。

+0

什么是错误? – quasiverse

+2

一个明显的错误是你正在通过'VShop * Film = new VShop [size]'创建一个空指针。由于'size' == 0,你根本没有分配任何内存(我甚至不确定'new Foo [0]'是否定义好了)。如果你在任何情况下使用C++,为什么不用数据库中的矢量? –

+0

谢谢,它的工作。只需要重写我的功能。我不知道任何有关向量的信息,因为我刚开始学习C++。再次感谢。 – Atre

回答

1

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

VShop *Film = new VShop[size]; 

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

其次:

*size++; 

++的优先级高于*所以它的计算结果为:

*(size++); 

,而增量的大小,然后取消引用大小值。你可能想:

(*size)++; 

其递增int的值由size指向。

0

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

试试看,

(*size)++; 

这将导致评估表达式的大小所指向的值增加1。

+0

这会增加指针,但对值不起作用。 – quasiverse

+0

请参阅编辑。最初错过了尺寸参数。 – Bitmap

1

这里你有一个很大的问题。看:

VShop *Film = new VShop[size]; 

然后尝试长大大小可变但并没有改变数组大小:

您大小为零创建阵列

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

阵列仍具有零长度,但您试图更改第一个(零)元素的某些数据:

Film[*element].fName = name; 

您必须在插入新元素之前调整其大小:

  1. 创建具有适当大小的新阵列;
  2. 将旧数组中的所有数据复制到新的;
  3. 删除旧数组;
  4. 用新的替换旧数组的指针。

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

无论如何,阅读一些关于C++和C++内存管理的书籍。

+0

谢谢,它有帮助。 – Atre