Char *表现得很奇怪(正在改变价值)

时间:2013-02-20 08:27:24

标签: c

变量:

struct configSetting {
    char *value;
};
char *stringResult;
char str[255];
int intResult;
int *p_intResult;
int i = 0;
p_intResult = &intResult;

我正在将int转换为字符串:

struct configSetting settings[NUMBEROFSETTINGS];
settings[i].value = itoa(intResult, str, 10);

printf将正确的值输出到控制台:

printf("\nVALUE: %s", settings[i].value);

之后我将另一个函数中的值写入控制台,输出在这两个printf之间发生变化:

printf("\nTEST 1: %s;%i", settings[15].value, strlen(settings[15].value));
printf("\nTEST 2: %s;%i", settings[15].value, strlen(settings[15].value));

这是控制台中的结果: 测试1:50; 2 测试2:↑↑; 3

所以设置[15] .value中的char *在printf之间发生变化,我不明白为什么?

提前致谢!

2 个答案:

答案 0 :(得分:4)

您将使用后续调用覆盖itoa()的最后一个值。

这个电话:

settings[i].value = itoa(intResult, str, 10);

正在使用变量str[]。每次执行此操作都会覆盖最后的结果。此外,如果str[]是本地的并且settings是全局的,则存储的结果指针不再有效,并且它是未定义的行为。

使用malloc()strdup()或其他类似动态分配值字符串,或更改此内容:

struct configSetting {
    char *value;
};

要包含一个真正的缓冲区,如下所示:

struct configSetting {
    char value[64];
};

然后直接itoa()到设置:

itoa(intResult, settings[i].value, 10);

答案 1 :(得分:2)

您正在使用相同的str缓冲区,并为每个转换后的值存储对它的引用(settings[i].value = itoa(intResult, str, 10);)。下一次调用itoa将覆盖旧值。