【问题标题】:Expression must be a modifiable lvalue pointer-to-char parameter表达式必须是可修改的左值指针到字符参数
【发布时间】:2011-02-15 16:42:47
【问题描述】:

这是整个代码。编译后出现以下错误:

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

致命错误 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;
}

【问题讨论】:

  • CandyBar 结构是什么样的?
  • 您需要提供CandyBar的定义!
  • 编辑显示 CandyBar 的结构
  • 为什么 char[30] 和 char 指针不一样?数组和指针基本上不是一回事吗?
  • 不,它们不一样。当作为函数调用参数传递时,数组“退化”为指针。您的 name[40] 数组占用 40 个字节的内存,并且存在大小信息(请参阅我使用 sizeof 的答案)。 char * 只是一个指向 char 的指针,它没有嵌入真正的大小信息,您可以选择将其视为指向 char 数组的指针,而编译器无法判断这是否正确。跨度>

标签: c++ lvalue


【解决方案1】:

由于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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您将 CandyBar.name 定义为一个数组,它与 char 指针不同。您将不得不使用 strcpy 之类的东西而不是赋值语句。最好只使用 STL 字符串。

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

      【讨论】:

        【解决方案4】:

        正如目前所说的那样,缺少的是 ;在 struct CandyBar 的右大括号之后。

        【讨论】:

          【解决方案5】:

          使用这个:

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

          编辑:并回答您完全改变的问题:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-07
            • 2021-09-17
            • 2014-12-15
            相关资源
            最近更新 更多