2017-09-19 75 views
0

我有一个函数,返回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 
+2

'返回intToString((NUM +增量)* 10 ).c_str();' - std :: string'支持该指针在调用者获取地址时消失。你的程序调用未定义的行为。第一种情况下的临时使用期限延长。在第二个中,唯一临时保留的是一个悬挂指针。 – WhozCraig

回答

4

c_str()返回值是唯一有效,只要该字符串对象存在并且没有被修改。像helper那样从暂时返回它是不正确的。改为返回std::string,并且仅在实际需要将其用作c字符串的站点上使用c_str()

参考:http://www.cplusplus.com/reference/string/string/c_str/

0

下面是仅使用C++的对象和流中的等效代码:

#include <iostream> 
#include <string> 
#include <iomanip> 

std::string helper(int num, int increment) { 
    return std::to_string((num + increment) * 10); 
} 

int main() { 
    for (int i=1; i < 5; i++) { 
     std::cout << "- " << i 
     << ": " << std::setw(3) << std::to_string((i + 0) * 10) 
     << " " << std::setw(3) << std::to_string((i + 1) * 10) 
     << " " << std::setw(3) << std::to_string((i + 2) * 10) 
     << " " << std::setw(3) << std::to_string((i + 3) * 10) 
     << '\n'; 

     std::cout << "+ " << i 
     << ": " << std::setw(3) << helper(i, 0) 
     << " " << std::setw(3) << helper(i, 1) 
     << " " << std::setw(3) << helper(i, 2) 
     << " " << std::setw(3) << helper(i, 3) 
     << '\n'; 
    } 
    return 0; 
} 

预期输出:

- 1: 10 20 30 40 
+ 1: 10 20 30 40 
- 2: 20 30 40 50 
+ 2: 20 30 40 50 
- 3: 30 40 50 60 
+ 3: 30 40 50 60 
- 4: 40 50 60 70 
+ 4: 40 50 60 70 
相关问题