gpt4 book ai didi

c - 我有一个返回结构体 char* 成员的函数。我试图调用该函数并为其分配一个字符串,但出现错误

转载 作者:行者123 更新时间:2023-11-30 14:56:31 25 4
gpt4 key购买 nike

这是函数:

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. 如何给字符串赋值?

  1. 返回值

无需将返回值分配给变量。这不是问题。

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

int retval()
{
return 5;
}

显然你不能给返回值赋值:

retval() = 7;

这相当于......

5 = 7;

...这是非法的并且完全没有意义。

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

int retval()
{
int r = 5;
return r;
}

同样,显然你不能为返回值赋值:

retval() = 7;

仍然相当于......

5 = 7;

…并且

r = 7;

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

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

int retval()
{
char *r = malloc(…); // or whatever
return r;
}

您返回一个指针值(因为函数返回 C 中的值),而不是“指针变量”。因此

retval() = 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 相同。)

与指针值的区别在于,您可以使用它们(右值)来创建左值,即。例如:

*(retval()) = 'a';
  • 分配字符串
  • 在 C 中,不能使用 = 分配字符串,因为那样会分配指针,而不是字符串本身。

    char * str = "a string";
    str = "another string";

    ... 不会将第二个字符串分配给 str。这两个示例都只是将指向字符串文字的第一个字符的指针分配给指针变量。

    您必须使用strcpy()等。

  • 现在大家在一起
  • 要将它们放在一起,您必须使用返回值作为右值,并且必须使用 strcpy() 等。

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

    关于c - 我有一个返回结构体 char* 成员的函数。我试图调用该函数并为其分配一个字符串,但出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44618002/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com