C - strcpy有什么特殊属性吗?

时间:2015-10-17 10:42:20

标签: c binary-tree strcpy

每当我尝试在程序中将字符串插入二叉树时,我必须使用strcpy并使用strcpy的目标来成功插入。如果我不使用strcpy并仅使用源代码,则会导致程序崩溃。

示例:

char *originalstring;
originalstring = (char *)calloc(alloc + 1, sizeof(char));
originalstring = "Hello.";
insert(&root, originalstring); //into binary tree

导致崩溃。

char *newstring, *originalstring;

originalstring = (char *)calloc(alloc + 1, sizeof(char));
originalstring = "Hello.";

newstring = (char *)calloc(alloc + 1, sizeof(char));
strcpy(newstring, originalstring);

insert(&root, newstring);

将其插入树中。我的完整程序当然要大得多,但我真的不认为这与我被迫使用strcpy插入一个字符串有什么关系。这让我想问strcpy是否有特殊的东西。

编辑:我还尝试手动nullbyte originalstring的结尾,但失败了。

2 个答案:

答案 0 :(得分:2)

执行此操作时:

originalstring = (char *)calloc(alloc + 1, sizeof(char));
originalstring = "Hello.";

您首先为字符串分配一些存储空间,这很好,但是在第二行中,您将使用指向字符串文字的指针替换指向此存储的指针。然后原始分配“丢失”(导致内存泄漏),如果您尝试修改originalString的内容,您将得到未定义的行为,因为您现在指的是最有可能读取的内容 - 只有记忆。如果您随后尝试free此字符串(因为它未通过malloc分配),您也会得到未定义的行为。

所以,底线:始终使用strcpy来复制字符串 - 在操作指向字符串的指针时只使用直接赋值(=)。

<小时/> 关于编码风格的一些补充说明:

所以上面的分配应该写成:

originalstring = calloc(alloc + 1, 1);

答案 1 :(得分:1)

将字符串文字It is not clear how to separate sentences since there is no punctuation. But suppose we know how to. Then just use Counter from collection. data = ''' This is a cat we are working at BusinessBrio Gitu is my beloved cat Jery is also a cat Boni is a nice dog Gitu is my beloved cat we are working at BusinessBrio This is a cat we are working at BusinessBrio Gitu is my beloved cat Jery is also a cat Boni is a nice dog Gitu is my beloved cat we are working at BusinessBrio ''' li = data.split('\n') from collections import Counter pp(Counter(li)) Counter({'we are working at BusinessBrio': 4, 'Gitu is my beloved cat': 4, 'Boni is a nice dog': 2, 'This is a cat': 2, 'Jery is also a cat': 2, '': 1, ' ': 1}) 分配给指针originalstring导致指针指向该字符串文字,放弃分配的内存。如果您尝试释放此指针或修改字符串文字,则会导致崩溃。 / p>