2012-04-10 89 views
0

试图让'sval'包含数组索引0-499的字符串“$ 1” - “$ 500”。在下面的代码,但是itoa是给我下面的代码奇怪的字符串:int到字符串,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; 
     } 
    } 

似乎也itoa已经贬值了,但是这是我得到了什么,当我GOOGLE INT串

+0

为什么?告诉我,为什么'** d' ?????只是为了让你可以做'(* d)[i]'?真?! – littleadv 2012-04-10 06:06:17

+1

只需使用'std :: string'。 – 2012-04-10 06:06:53

+0

你不应该同时使用'malloc'和'new'。顺便说一句,'malloc'应该用'sizeof(data_t)* 500'而不是'500'来调用。但更好的是,你不应该在C++中使用'malloc',它只与C兼容。 – vsz 2012-04-10 06:09:28

回答

3

你不需要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 2012-04-10 06:30:23

+0

我建议不要这样做。如果绝对必要 - 使用'std :: string',而不是'char'的数组。如果绝对需要使用数组 - 确保为它们实际分配一些内存。 – littleadv 2012-04-10 06:35:30

+0

当你说为数组分配内存和下面的代码是坏的(猜测全局变量是nono?),我在哪里分配它? 另外什么是最简单的方法来获得sval = $ 1- $ 500? – Sun 2012-04-10 06:45:22