我有一个函数';返回结构的char*成员。我试图调用该函数并为其分配一个字符串,但遇到了一个错误

我有一个函数';返回结构的char*成员。我试图调用该函数并为其分配一个字符串,但遇到了一个错误,c,struct,C,Struct,下面是函数: char* cycle(structtype *structname, int index){ switch(index){ case 1: return structname->structmem; //structmem is a char* ...} 以下是main中函数的调用: struct structtype *structname; structname = malloc(sizeof(struc

下面是函数:

char* cycle(structtype *structname, int index){
    switch(index){
        case 1:
            return structname->structmem; //structmem is a char*
        ...}
以下是main中函数的调用:

struct structtype *structname;
structname = malloc(sizeof(structtype));
line[250];
fgets(line,250,file);
data = strtok(line,",");
cycle(structname,index) = data;

即使提供的答案有效,我认为讨论也混淆了两个不同的问题:a)返回值意味着什么?2.如何分配字符串值

  • 返回值
  • 不需要将返回值指定给变量。这不是问题所在

    让我们从头开始:你有一个函数,它返回一个值

    int retval()
    {
      return 5;
    }
    
    显然,您不能为返回值赋值:

    retval() = 7;
    
    retval() = 7;
    
    这相当于

    5 = 7;
    
    5 = 7;
    
    0xf037ab = 7; // or whatever pointer /value/
    
    …这是非法的,毫无意义

    好的,让我们把它变得更复杂:

    int retval()
    {
      int r = 5;
      return r;
    }
    
    同样,显然不能为返回值赋值:

    retval() = 7;
    
    retval() = 7;
    
    这仍然相当于

    5 = 7;
    
    5 = 7;
    
    0xf037ab = 7; // or whatever pointer /value/
    
    …而不是

    这是因为C按值从函数返回值。这是一个简单明了的值。(您可以将其称为右值,它可以转换为右值,这意味着它是赋值右侧的值。)

    现在,让我们用指针来做:

    int retval()
    {
      char *r = malloc(…); // or whatever
      return r;
    }
    
    返回的是指针值(因为函数在C中返回值),而不是“指针变量”。所以

    retval() = 7;
    
    仍然相当于

    5 = 7;
    
    5 = 7;
    
    0xf037ab = 7; // or whatever pointer /value/
    
    ……这仍然毫无意义,显然是非法的。使用变量(这是左值的经典示例,但在C中不是唯一的示例,请参见下文)使事情合法,但具有不同的语义:

    因此

    char *mem = retval(); // legal, return value is on the right side
    mem = …; // legal, because mem is a lvalue
    
    …是合法的,但做了一些不同的事情:

    char *mem = 0xf037ab;
    mem = 0x5383fa3; // or whatever pointer value
    
    您只是丢失了返回值。(同样地,
    int
    s也是如此。)

    指针值的不同之处在于,您可以使用它们(右值)创建左值,即。e、 :

    *(retval()) = 'a';
    
  • 赋值字符串
  • 在C语言中,不能用
    =
    分配字符串,因为这将分配指针,而不是字符串本身

    char * str = "a string";
    str = "another string";
    
    …不会将第二个字符串分配给
    str
    。这两个示例都只是将字符串文字的第一个字符的指针指定给指针变量

    您必须使用
    strcpy()

    strcpy(data, cycle(structname,index)); // Passing an arg is possible with rvalues
    
  • 现在一起
  • 要将它们放在一起,必须使用返回值作为rvalue,并且必须使用
    strcpy()

    strcpy(data, cycle(structname,index)); // Passing an arg is possible with rvalues
    

    …错误呢。。。以及
    struct
    定义。。。和
    索引
    ?请发布显示问题的消息。@Weather Vane错误只是“错误:表达式不可赋值”。Index只是我正在使用的结构的当前成员的索引,例如给定的索引只有1,因为我的结构中只有1个成员。然而,在我的实际代码中有20个。@Justin,这是因为您不能分配给函数<代码>循环(结构名称,索引)=数据这是不正确的。@ameyCU如果返回一个字符*为什么我不能将其设置为另一个字符*?我对C不太熟悉,所以我将它与C中的一个方法联系起来,该方法返回一个字符串,然后将该方法设置为另一个字符串;如果(!tmp){..句柄错误..};strcpy(数据,tmp)str”(这是一个nit,但现在不妨将OP引入字符串文字术语…@DavidC.Rankin哇,你是我的一个双重同事。我从来没见过。