2017-05-26 56 views
-3

我写了下面的代码,以便通过','打破一行,并将数据动态地放入2d指针数组中。在c中打破2d指针数组,我在做什么错了?

所以,如果该行是:

你好,世界,我的名字,是

二维指针数组将是:

你好

世界

我的名字

我有点新的C,所以我不知道,如果代码写得好。

当参数是我想要打破的行。

char *parameters = "A line I want to break by, Hello"; 
char ** inputs; 
int number = 1; 
inputs = (char**) malloc(sizeof(char)); 
const char s[2] = ","; 
char *token; 
token = malloc(sizeof(parameters)); 
strcpy(token,parameters); 
token = strtok(token, s); 
while(token != NULL) 
{ 
    inputs[number - 1] = malloc(sizeof(token)); 
    strcpy(inputs[number - 1],token); 
    number++; 
    inputs = (char **) realloc(inputs, sizeof(char)*(number+1)); 
    token = strtok(NULL, s); 
} 

出于某种原因,它适用于1或没有','排队,但为更多的打印一个非常奇怪的东西。

例如:

如果线路

你好,世界

输出将是:

你好?

世界

它看起来像一个记忆的问题,但我不能找到它。 也欢迎提供其他技巧和更好的解决方法。

+1

'malloc(sizeof(char));'分配**一个字节**的内存。 –

+0

'malloc(sizeof(token));'只分配给**指针**而不是指向它的字符串。 –

+0

'char **'不是一个二维数组,也不是一个指针!指针不是数组!一般来说,不要把'malloc'和朋友或'void *'的结果放在一起! – Olaf

回答

2

对于任何事情,您都没有分配足够的内存。首先,

inputs = (char**) malloc(sizeof(char)); 

只分配一个字节的内存,你想要一个指针数组。因此,要获得的第一个元素存储的代码应该是

inputs = malloc(sizeof(char*)); 

然后当你重新分配阵列它只是用字节大小与

inputs = (char **) realloc(inputs, sizeof(char)*(number+1)); 

仍然相似,没有指针大小,并应

inputs = realloc(inputs, sizeof(char*) * (number+1)); 

虽然这是更好地分配给一个临时变量,直到你知道realloc是全成。也请注意,我不是从mallocrealloc投射返回值。

再有就是你具有作为

inputs[number - 1] = malloc(sizeof(token)); 

这是不是为令牌数据分配内存,而只是一个指针令牌的数据的内存分配,而应该是

inputs[number - 1] = malloc(strlen(token) + 1); 

话虽如此,number - 1number + 1有一些笨拙的用法,可能会影响你的算法。最好咬住子弹,并接受在C索引开始于0而不是在1

最后可以说一无所知行

token = malloc(sizeof(parameters)); 

,因为我们不知道什么是parameters,但是从其他分配来看,很可能是不正确的。但它确实导致内存泄漏:您稍后覆盖token等不能free它的原始内存。

+0

谢谢!现在它的工作,当我将结束写所有它,我会用你的提示! – Yonlif