变量:
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之间发生变化,我不明白为什么?
提前致谢!
答案 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
将覆盖旧值。