从C函数返回的字符串是垃圾

时间:2016-03-30 23:16:10

标签: c structure

我最近一直在用C语言编写RPG,而且我遇到了一些从文本文件中保存/加载某些数据的困难。

以下是(简化为简短)代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct player{
    int id;
    char* name;
};

void save(struct player* player)
{
    FILE* fp = 0;
    char* buffer = 0;

    fp = fopen("./gamesave.txt", "w");
    fclose(fp);
    buffer = malloc(80);
    memset(buffer, 0, 80);

    snprintf( buffer, 80, "%d|%s|\n", player->id, player->name);
    fp = fopen("./gamesave.txt", "a");
    fputs(buffer, fp);
    free(buffer);
    fclose(fp);
}

struct player* load()
{
    FILE* fp = 0;
    char* buffer = 0;
    struct player* player = malloc(sizeof(struct player));
    char tokens[] = "|\n";

    buffer = malloc (80);
    memset(buffer, 0, 80);

    fp = fopen("./gamesave.txt", "r");

    if (fgets(buffer, 80, fp)) {
        char temp[20];
        player->id = atoi(strtok(buffer, tokens));
        strcpy(temp, strtok(NULL, tokens));
        player->name = temp;
        printf("during load : name is %s\n", player->name);
    }
    fclose(fp);
    free(buffer);
    return player;
}

void main()
{


    struct player* player = malloc(sizeof(struct player));
    player->id = 5;
    player->name = "Bobby";
    printf("before save : my name is %s and id is %d\n", player->name, player->id);

    save(player);
    struct player* playerN = load();
    printf("after load : name is %s and id is %d", playerN->name, playerN->id);
}

这是我最近尝试这样做但我尝试了许多不同的方法,但它几乎总是以相同的问题结束:我似乎无法获得字符串的正确值虽然它适用于整数。我可以在保存之前,在加载函数期间打印播放器的名称,但是在加载之后它只打印垃圾(id工作得很好)。

我的猜测是,它与某种记忆问题有关,但就是这样,在数小时后无法解决。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您需要为player->name分配空间。

您正在使用自动变量temp,它的生命周期在函数返回时结束。自动变量在堆栈中。

所以你要在堆栈上取一个地址并将它作为你的对象。这会泄漏指向当前堆栈级别的指针,因为您将其返回。可以使用指向自动变量的指针,但仅在该函数实例处于活动状态时,即在其生命周期和它调用的函数中。