2013-09-26 39 views
0
#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 
#include<iostream> 
using namespace std; 
#define attr_size 3 

int main(){ 
const char* attr[attr_size]; 
int i=0; 
for(i=0;i<attr_size;i++){ 

    char* t=(char*)malloc(sizeof(int)); 
    sprintf(t,"%d",i); 
    string temp="attr"; 
    temp+=t; 
    attr[i]=temp.c_str(); 
    cout<<attr[i]<<endl; 
    free(t); 
} 
for(i=0;i<attr_size;i++){ 
    cout<<attr[i]<<endl; 
} 
} 

,其結果是:有關C++ char *的錯誤代碼。任何身體視圖?

attr0 
attr1 
attr2 
attr2 
attr 
attr2 

其實,我想要得到的結果是:

attr0 
attr1 
attr2 
attr0 
attr1 
attr2 

也許有毛病循環。有人幫助我嗎?

回答

3

問題是c_str返回一個臨時指針。所以當循環繼續迭代時,你得到指針的對象被破壞,並且指針不再有效,當你稍後取消引用該指針時會導致未定義的行爲。

如果你想要一個字符串數組,爲什麼不把它聲明爲一個字符串數組?


還有其他問題與您的代碼,就像你只爲一個字符串,可以是12(帶符號和字符串結束)字符分配四個字節。


我建議你重拍你的程序是這樣的:

#include <iostream> 
#include <array> 
#include <sstream> 

const size_t ATTR_SIZE = 3; 

int main() 
{ 
    std::array<std::string, ATTR_SIZE> attr; 

    for (int i = 0; i < ATTR_SIZE; ++i) 
    { 
     std::istringstream is; 
     is << "attr" << i; 
     attr[i] = is.str(); 
    } 

    for (const std::string& s : attr) 
     std::cout << s << '\n'; 
} 

上面使用了一些C++ 11的功能,如std::array(你可以用std::vector代替)和range-base for loop(你可以使用正常的迭代代替)。

+1

「只要字符串對象本身有效」實際上c_str()的結果可以比這更早地失效。調用任何非const成員函數或將非const引用傳遞給任何庫函數的字符串都會使結果無效。 – bames53

+0

@ bames53好,我重新解釋了答案。 –

+0

當然,但我想返回一個const char * attr。不返回一個字符串。 – tonymiao