C 为什么我使用StrDup时strtok_有效?

C 为什么我使用StrDup时strtok_有效?,c,windows,string,C,Windows,String,我将strtok_与分配的字符串一起使用 上面的代码处理一个异常: char *string1 = NULL; string1 = (char*)LocalAlloc(LPTR, 100 * sizeof(char)); // TODO: Verify if string1 != NULL string1 = "A string\tof ,,tokens\nand some more tokens"; token1 = strtok_s(cp1, seps, &next_token1)

我将strtok_与分配的字符串一起使用

上面的代码处理一个异常:

char *string1 = NULL;
string1 = (char*)LocalAlloc(LPTR, 100 * sizeof(char));
// TODO: Verify if string1 != NULL
string1 = "A string\tof ,,tokens\nand some  more tokens";
token1 = strtok_s(cp1, seps, &next_token1);
但当我调用StrDup时,我的代码可以工作:

cp1 = StrDup(string1);
token1 = strtok_s(cp1, seps, &next_token1);
然而,我对StrDup的理解是,它使用LocalAlloc为字符串的副本分配存储空间(根据)

那么,在我的第一个例子中有什么错?如何在不使用StrDup的情况下更正此代码

string1 = (char*)LocalAlloc(LPTR, 100 * sizeof(char));
// TODO: Verify if string1 != NULL
string1 = "A string\tof ,,tokens\nand some  more tokens";
token1 = strtok_s(cp1, seps, &next_token1);
你已经覆盖了你的指针。。。它以NULL开头,您将其指向已分配的空间(这是您的意图),然后将其更改为指向只读的内容,即c字符串常量。由于strtok_s需要能够写入缓冲区,因此它会失败。相反,当您创建字符串的另一个(可写)副本时,
strdup()

而不是设置
string1=“某些常量字符串”
您可以使用
strcpy()
(为安全起见,它的长度限制版本之一)将只读字符串常量复制到缓冲区中。这会让您在没有
strdup()
的情况下到达需要的位置,但由于
strdup()
会为您执行分配,因此直接转到它并删除分配/复制将使您的工作更轻松。

此行

string1 = "A string\tof ,,tokens\nand some  more tokens";
没有达到你的预期

您想将常量字符串的内容写入
string1
指向的内存缓冲区。实际上,您所做的是将
string1
的值更改为指向编译器分配用于保存常量字符串的内存

做你想做的事情的一个方法是

strcpy(string1, "A string\tof ,,tokens\nand some  more tokens");

我认为你在泄露记忆。你丢失了LocalAlloc返回的指针。哦,天哪,这是新手犯的错误。。。我写这个问题时感到不安。谢谢你的回答。