每次我尝试将字符串插入程序中的二叉树时,我都必须使用 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
是否有特殊的东西。
编辑:我还尝试手动将 originalstring
的末尾设置为空字节,但失败了。
最佳答案
当你这样做时:
originalstring = (char *)calloc(alloc + 1, sizeof(char));
originalstring = "Hello.";
您首先为字符串分配一些存储空间,这很好,但是在第二行中,您将指向该存储空间的指针替换为指向字符串文字的指针。然后,原始分配已“丢失”(导致内存泄漏),如果您尝试修改 originalString
的内容,您将得到未定义的行为,因为您现在指向的是最重要的内容。可能是只读存储器。如果您随后尝试释放
此字符串(因为它不是通过malloc
分配的),您也会得到未定义的行为。
因此,底线:始终使用 strcpy
来复制字符串 - 仅在操作字符串指针时使用直接赋值 (=
)。
- never cast the result of malloc in C - 这是不必要的,而且有潜在危险
sizeof(char)
根据定义始终等于1
所以上面的分配实际上应该写成:
originalstring = calloc(alloc + 1, 1);
关于C - strcpy 有什么特殊属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185643/