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

结果是:

attr0
attr1
attr2
attr2
attr
attr2

实际上,我想得到以下结果:

attr0
attr1
attr2
attr0
attr1
attr2

循环可能有问题。有人帮我吗?

4

1 回答 1

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)和基于范围的for循环(你可以使用普通迭代)。

于 2013-09-26T03:32:26.420 回答