传递参数,指针和地址问题

时间:2011-09-21 08:37:21

标签: c++ pointers parameter-passing

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

#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时,我都会收到错误。它发生了什么?感谢。

3 个答案:

答案 0 :(得分:1)

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

VShop *Film = new VShop[size];

size0,可能会失败,在您尝试访问时无效。

其次:

*size++;

++的优先级高于*,因此评估为:

*(size++);

同时增加大小,然后取消引用大小的值。你可能想要:

(*size)++;

增加int所指向的size的值。

答案 1 :(得分:1)

这里的内存存在很大问题。看:

您创建了零大小的数组:

VShop *Film = new VShop[size];

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

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

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

Film[*element].fName = name;

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

  1. 创建具有适当大小的新数组;
  2. 将旧数组中的所有数据复制到新数组;
  3. 删除旧数组;
  4. 用新的指针替换指向旧数组的指针。
  5. 另一个变体是使用std :: vector。

    无论如何,在c ++和c ++中读一些关于内存管理的书。

答案 2 :(得分:0)

  

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

尝试使用;

(*size)++;

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