我正在调用返回类型struct Function的函数,如下所示:
typedef enum {string,integer} ReturnType;
typedef struct Function{
ReturnType returnType;
char *token;
char *tokenProgress;
char *result;
void (*init)(struct Function *self);
} Function;
void Function_init(Function *self, ReturnType returnType,char *token, char *tokenProgress){
self->returnType = returnType;
self->token = token;
self->tokenProgress = tokenProgress;
self->result = "";
}
在我的程序的主循环中,我想打印结构中包含的结果指针,如下所示:
int main(int argc, const char * argv[]){
while(true){
scanf("%s",command);
Function *func = executeCommand(command);
printf("%s\n", func->result);
}
}
这是executeCommand:
Function * executeCommand(char command[]){
Function *currentFunction;
char *token;
char *tokenProgress;
Function_init(currentFunction,integer,token,tokenProgress);
char result[11];
sprintf(result,"%d",3);
currentFunction->result = result;
return currentFunction;
}
但是,当我运行该程序时,只有在打印时才会打印换行字符" 3 \ n"。我使用gdb运行程序来检查func->result
是否有值:
(gdb) print func->result
(char *) $0 = 0x00007fff5fbffa9d "3"
我在打印行func->result
的行上的断点处检查了这个值,所以我不知道它为什么不打印,因为它显然有一个值并且结构正在正确返回。
答案 0 :(得分:2)
currentFunction->result = result
中的executeCommand
,可让您的结构result
- 成员指向本地变量result
。 executeCommand
完成后,此局部变量的存储将被解除,并且您的结构成员将指向“无效”内存。
为了避免在executeCommand
完成时丢失局部变量,可以在executeCommand
内分配内存(例如,使用malloc
或calloc
或realloc
)提供result
的存储空间,该存储空间将在executeCommand
返回后继续存在。