在C中打印字符指针的问题

时间:2017-03-01 07:08:41

标签: c pointers struct

我正在调用返回类型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的行上的断点处检查了这个值,所以我不知道它为什么不打印,因为它显然有一个值并且结构正在正确返回。

1 个答案:

答案 0 :(得分:2)

currentFunction->result = result中的executeCommand,可让您的结构result - 成员指向本地变量resultexecuteCommand完成后,此局部变量的存储将被解除,并且您的结构成员将指向“无效”内存。

为了避免在executeCommand完成时丢失局部变量,可以在executeCommand内分配内存(例如,使用malloccallocrealloc)提供result的存储空间,该存储空间将在executeCommand返回后继续存在。