gpt4 book ai didi

c - 理解 strtok 返回的指针

转载 作者:行者123 更新时间:2023-11-30 15:20:32 25 4
gpt4 key购买 nike

我有这段代码,我在其中标记一个字符串并搜索一个值。

char string[]="Name=Marcus&greeting=goodmorning";
char* Name=parsePostData("Name",string);




char* parsePostData(char s[],char t[])
{
char *pch;
char *pp="Marcus";

char tCpy[512];//Make a copy. Otherwise, strtok works on the char pointer, and original char array gets modified/ corrupted.
strcpy(tCpy,t);
pch = strtok (tCpy,"=&");
while (pch != NULL)
{
if(strcmp(pch,s)==0) {
pch= strtok (NULL, "&");
//Case 1. what I need. but it is causing issues
//after I write to flash, and restart the board.
return pch;

//Case 2. Forced test case. works perfect.
//return pp;


}else{
pch = strtok (NULL, "=&");
}
}

}

函数内部的两种情况有什么区别?

最佳答案

what is the difference between the two cases inside the function?

案例 1。

正如现在有几个人告诉你的那样,顺序

pch = strtok (tCpy,"=&");
/* ... */
pch= strtok (NULL, "&");

导致pch成为指向本地数组tCpy的指针(如果原始字符串不包含“=”或“&”,则为NULL)。因为 tCpy 是一个本地数组,所以它在函数末尾超出范围,此时指向它的任何指针都不再有效。实际上,它占用的内存可能会被下一个调用的函数重用。

<小时/>

案例 2。

代码

char *pp="Marcus";

初始化pp以指向一个静态、匿名字符数组,其内容是以空结尾的字符串“Marcus”。由于数组具有静态存储期限,因此指向它的指针在函数退出后仍然有效。

<小时/>

您可以通过三个主要选项来解决此问题:

  1. 调用者为函数提供字符串副本的预分配存储空间。这可能是一个工作数组(不一定是动态分配的),或者它可以采取只让函数使用字符串的形式,调用者负责在必要时制作副本。
  2. 该函数动态地为副本分配存储空间。有很多方法可以实现,但是 strdup() 函数是一种快速、简单的一步分配和复制方法。
  3. 您可以将数组 tCpy 设为静态。然后,从函数返回后,指向它的指针将保持有效,但该空间将在每次调用该函数时重用,可能会更改指针指向的文本。

注意:分配内存以返回给调用者的函数的任何变化都会让调用者有责任在不再使用该内存时释放该内存。这样做需要一个指向分配 block 的开始的指针,而不是中间的某个随机位置,因此您需要传回两个指针才能使其工作(一个通过参数)。

总而言之,我认为选择选项 1 的变体是明智的。如果是我,我只会让函数使用传递给它的字符串。

更新:另外,在情况 2 中,程序镜像包含指针指向的数据。假设它总是在相同的地址加载,保存和恢复指针值而不是它指向的值实际上可能仅适用于该程序,因为您通过在其上加载程序镜像来重新初始化指向的内存。如果将字符串复制到工作数组中,则上述情况不适用,因为即使该数组具有静态持续时间,它也不会使用您要恢复的数据进行初始化。

关于c - 理解 strtok 返回的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29956847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com