[英]I am trying to pass a string into a function with a double pointer but getting an error
[英]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.如何分配字符串值?
不必將返回值分配給變量。 這不是問題。
讓我們從一開始就做:您有一個函數,這將返回一個值
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()
等。
綜上所述,您必須使用返回值作為rvalue,並且必須使用strcpy()
等。
strcpy(data, cycle(structname,index)); // Passing an arg is possible with rvalues
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.