1

变量:

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));

这就是控制台中的结果: TEST 1: 50;2 TEST 2: ý³↑;3

所以 settings[15].value 中的 char* 在 printf 之间发生变化,我不知道为什么?

提前致谢!

4

2 回答 2

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);
于 2013-02-20T08:30:37.910 回答
2

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

于 2013-02-20T08:30:26.873 回答