2012-04-10 6 views
0

배열 색인 0-499에 "$ 1"문자열을 포함하도록 'sval'을 가져 오려고합니다. 다음 코드에서, 그러나 itoa는 나에게 아래의 코드에서 이상한 문자열을주고있다 : 또한 itoa는 감가 상각 된 것 같다int to string, char * itoa

#include<iostream> 
    #include <stdio.h> 
    #include <stdlib.h> 
    using namespace std; 


    typedef struct data_t { 
     int ival; 
     char *sval; 
    } data_t; 

    void f1(data_t **d); 
    int main() 
    { 
    data_t *d; 

     d=static_cast<data_t*>(malloc(500)); //is this even needed? 
     d = new data_t[500]; 
     f1(&d); 
    } 

    /* code for function f1 to fill in array begins */ 
    void f1(data_t **d) 
    { 
     int i; 
     char str[5]; 
     for (int i=0; i<500; i++) 
     { 
      (*d)[i].ival=i+1; 
      itoa (i,str,10); 
      (*d)[i].sval= str; 
     } 
    } 

을하지만 내가 문자열

+0

왜? 말해봐, 왜'** d' ????? 단지 당신이'(* d) [i]'할 수 있도록? 정말?! – littleadv

+1

그냥'std :: string'을 사용하십시오. –

+0

당신은'malloc'과'new'를 동시에 사용하지 말아야합니다. 그런데'malloc'은'sizeof (data_t) * 500'이 아닌'500'으로 호출되어야합니다. 하지만 더 나은 점은 C++에서'malloc'을 절대 사용하지 말아야한다는 것입니다. – vsz

답변

3

당신 돈에 INT를 봤 때 내가 무엇을 가지고 있었다 ltoa이 필요하고 cout은 정상적으로 처리됩니다. 배열에서 번호와 문자열 표현을 유지해야하는 이유는 무엇입니까? cout << 10을 수행하면 출력에 "10"이 표시되고 자신의 변환이 필요하지 않습니다.

문자열에 메모리를 할당하지 않고도 ltoa을 수행하면 아마 알아 차렸을 것이다. 함수를 종료 한 후 액세스하려고 시도하는 로컬 변수 (모든 500 개의 배열 멤버에 대해 동일)를 사용합니다. 이는 큰 아니요 아니요 정의되지 않은 동작입니다.

그리고 :

d=static_cast<data_t*>(malloc(500)); //is this even needed? 
    d = new data_t[500]; 

아뇨뿐만 아니라 필요 - 모두가 안됩니다! C++에서 - newdelete을 사용하면 결코 malloc이 아니라 C 함수입니다.

+0

malloc에 ​​대한 정보를 제공해 주셔서 감사합니다. "$ 1"- "$ 500"을 sval에 넣으려고 할 때 무엇을 제안 하시겠습니까? – Sun

+0

나는 그것을하지 않을 것을 제안 할 것이다. 절대적으로 필요한 경우 -'std :: string'을 사용하고'char' 배열은 사용하지 마십시오. 배열을 사용하는 것이 절대적으로 필요한 경우 실제로 배열에 메모리를 할당해야합니다. – littleadv

+0

당신이 배열에 대한 메모리를 할당하고 아래 코드가 좋지 않다고 말할 때 (전역 변수 a nono를 추측합니까?), 어디에 할당합니까? 추가적으로 sval = $ 1- $ 500을 얻는 가장 쉬운 방법은 무엇입니까? – Sun