2013-10-08 183 views
1

我在这里有一些奇怪的输出。你能解释我为什么以及如何解决它?C字符串malloc(输出)

int inp_str(char * string, char ** pointers[]) 
{ 
    char * tmp[stringsCount]; 
    if (strlen(string) > maxlen) 
    return (-1); 
    else { 
    tmp[count] = malloc(sizeof(char) * strlen(string)); 
    strcpy(tmp[count], string); 
    pointers[count] = &tmp[count]; 
    count++; 
    } 
    return count; 

} 


int main(){ 

    //char * strings[stringsCount]; 
    char ** pointers[stringsCount]; 
    inp_str("sdasya", pointers); 
    inp_str("dasd", pointers); 
    inp_str("qwe", pointers); 
    inp_str("dasd", pointers); 

    //sort(pointers, count); 
    printf("%s", *pointers[0]); 
    printf("\n%s", *pointers[1]); 
    printf("\n%s", *pointers[2]); 
    printf("\n%s", *pointers[3]); 
} 

这里是输出:

sdasya 
��uNH��H�l$ H�\$L�d$(L�l$0H��8�f.� 
qwe 
�bs7 

PS。 stringsCount是常量; count = 0

+0

欢迎来到Stack Overflow。请尽快阅读[关于]页面。您应该了解如何创建SSCCE([简短,独立,正确的示例](http://sscce.org/))。你的代码与SSCE相当接近,但它看起来只需要四行代码即可完成:两条'#include'行和'stringsCount'和'count'的定义。包括那些将会节省你编写最后一条PS线。 –

回答

3

由于char * tmp[stringsCount];是一个局部变量,在函数inp_str返回后,系统回收tmp的内存。所以指向该位置的指针在函数返回后无效。

+0

感谢您的快速回答,它的工作原理 – user2858814

0

我不知道我明白你在这里要做什么。但在任何情况下,都有几个问题:

1)您正在将字符串复制到未初始化的指针中。即您可以创建一个指向)的(char *)列表,然后将该字符串复制到该位置。如果你想把tmp指向你的字符串,不要使用strcpy,只需通过tmp [count] = string;

2)在堆栈上创建了tmp,所以如果你将它的值赋给指针**并尝试引用此函数范围之外的地址,那么这个内存就不见了,你可能会看到损坏的数据。

希望这会有所帮助。出于好奇,你想在这个功能上做什么?

+0

谢谢,这有助于。函数用于处理输入字符串:创建指针(用于快速排序的指针数组),返回指针/字符串数。 – user2858814

0

除了函数返回后失去tmp[]指针,你也总是短分配实际需要的量的一个字节:strlen(s)返回一个字符串的长度,这确实不包括终止NUL字节。 (注意的sizeof(char)的1 定义),你需要的是:

char *p = malloc(strlen(string) + 1); 
    strcpy (p, string); 

复制一个字符串。

+0

为什么不malloc(strlen(string)* sizeof(char)+ 1)? – user2858814

+0

@ user2858814因为如前所述,sizeof(char)的定义是1。总是。在任何编译器上。它永远不会是一个不同的价值。乘以1是毫无意义的,也是不能理解C型系统的一个说明。 – Jens