我有一个函数,返回std::string
。我将它传递给printf
,并创建了一个帮助函数,该函数使用通用参数调用该函数,并返回std::string
中的c字符串指针。每次通话都会收到相同的指针。我认为这与临时性的生活有关。如果可能的话,我想解决这个问题并使其安全。多个std ::字符串临时导致相同的c_str指针
#include <stdio.h>
#include <string>
std::string intToString(int num) {
char buf[100];
snprintf(buf, sizeof(buf), "%d", num);
return buf;
}
const char *helper(int num, int increment) {
return intToString((num + increment) * 10).c_str();
}
int main() {
for (int i=1; i < 5; i++) {
printf("- %d: %3s %3s %3s %3s\n", i,
intToString((i + 0) * 10).c_str(),
intToString((i + 1) * 10).c_str(),
intToString((i + 2) * 10).c_str(),
intToString((i + 3) * 10).c_str()
);
printf("+ %d: %3s %3s %3s %3s\n", i,
helper(i, 0),
helper(i, 1),
helper(i, 2),
helper(i, 3)
);
}
return 0;
}
输出:
- 1: 10 20 30 40
+ 1: 10 10 10 10
- 2: 20 30 40 50
+ 2: 20 20 20 20
- 3: 30 40 50 60
+ 3: 30 30 30 30
- 4: 40 50 60 70
+ 4: 40 40 40 40
'返回intToString((NUM +增量)* 10 ).c_str();' - std :: string'支持该指针在调用者获取地址时消失。你的程序调用未定义的行为。第一种情况下的临时使用期限延长。在第二个中,唯一临时保留的是一个悬挂指针。 – WhozCraig