【问题标题】:Char* is behaving weird (changing value in progress)Char* 行为怪异(正在更改值)
【发布时间】:2013-02-20 08:27:24
【问题描述】:

变量:

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

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

提前致谢!

【问题讨论】:

  • 什么是NUMBEROFSETTINGS

标签: c


【解决方案1】:

您正在使用后续调用覆盖 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);

【讨论】:

  • 哇,感谢您的快速回答,这完全是问题所在 --> settings[i].value = strdup(itoa(intResult, str, 10));现在可以使用了!
  • @kaljak 别忘了,strdup() 是一个伪装的 malloc()。当你不再需要它们时,一定要释放它们。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多