簡體   English   中英

我有一個返回結構的char *成員的函數。 我正在嘗試調用該函數並為其分配一個字符串,但出現錯誤

[英]I have a function that's returning a char* member of a struct. I am trying to call that function and assign a string to it, but am getting an error

功能如下:

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';
  1. 分配字符串

在C語言中,不要使用=分配字符串,因為那樣會分配指針,而不是字符串本身。

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

…不將第二個字符串分配給str 這兩個示例僅將指向字符串文字第一個字符的指針分配給指針變量。

您必須使用strcpy()等。

  1. 現在都在一起了

綜上所述,您必須使用返回值作為rvalue,並且必須使用strcpy()等。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM