表达式必须是可修改的左值指针到char参数

时间:2011-02-15 16:42:47

标签: c++ lvalue

这是整个代码。编译后我得到以下错误:

  

错误LNK2019:未解析的外部符号“void __cdecl CandyBarFunc(struct CandyBar&,char const *,double,int)”(?CandyBarFunc @@ YAXAAUCandyBar @@ PBDNH @ Z)在函数_wmain中引用

     

致命错误LNK1120:1未解决   的外部

#include "stdafx.h"
#include <iostream>
using namespace std;

struct CandyBar
{
    char name[40];
    double weight;
    int calories;
};

void CandyBarFunc(CandyBar & astruct, const char * aname = "Millennium Munch", double aweight = 2.85, int acalories = 350);
void CandyBarFunc(const CandyBar & astruct);

int _tmain(int argc, _TCHAR* argv[])
{
    CandyBar MyCandyBar;
    CandyBarFunc(MyCandyBar, "Hello World Candy Bar", 1.25, 200);
    CandyBarFunc(MyCandyBar);
    return 0;
}

void CandyBarFunc(CandyBar & astruct, char * aname, double aweight, int acalories)
{
    strncpy(astruct.name,aname,40);
    astruct.weight = aweight;
    astruct.calories = acalories;
}

void CandyBarFunc(const CandyBar & astruct)
{
    cout << "Name: " << astruct.name << endl;
    cout << "Weight: " << astruct.weight << endl;
    cout << "Calories: " << astruct.calories;
}

5 个答案:

答案 0 :(得分:3)

由于name定义为char name[40],因此您无法编写试图更改astruct.name = aname数组地址的name。但是阵列的地址不能改变。因此错误。

执行此操作:strcpy(astruct.name, aname);

更好的是,将CandyBar定义为

struct CandyBar
{
     std::string name;
     double weight;
     int calories;
};

现在你可以写:astruct.name = aname;

答案 1 :(得分:1)

你不能写char * aname = "Millenium Falcon",因为"Millenium Falcon"(const char *),是不可修改的内存。如果可以,请更改您的功能签名以接受const char * aname。或者使用std :: string,毕竟你正在编写C ++。

答案 2 :(得分:1)

您将CandyBar.name定义为数组,这与char指针不同。你必须使用类似strcpy而不是赋值语句。使用STL字符串会更好。

根据您的评论问题,请参阅here

答案 3 :(得分:1)

使用此:

  strncpy(astruct.name, aname, sizeof(astruct.name)); 
  astruct.name[sizeof(astruct.name)-1] = 0;

编辑:并回应你完全改变的问题:

“char * aname”与“const char * aname”不同。你转发声明一个(给出未解析的外部),然后实现另一个,从不调用。

答案 4 :(得分:1)

目前的问题是措辞,缺少的是;在结构CandyBar的结束括号之后。