gpt4 book ai didi

c - 使用 malloc 从 main 打印在函数中创建的字符串数组时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:56 25 4
gpt4 key购买 nike

为什么如果我在 main 函数中打印 myarray[x] 却得不到任何数据(空行)?数组已正确填充(如果我在函数中打印我得到值)

这是我的代码:

int main(void)  {
char thisxpath[300];
char thisurl[200];
char** myarray = NULL;
strcpy (thisurl,"http://api.openweathermap.org/data/2.5/weather?q=Pescara&mode=xml&units=metric");
strcpy (thisxpath,"//city/@name | //country | //weather/@value | //temperature/@value | //precipitation/@value | //humidity/@value | //speed/@*[name()='name' or name()='value']");
xmlretrive (thisurl, thisxpath, &myarray);

printf("%s\n", myarray[1]);

free(myarray);
return 0;
}

void xmlretrive(char* myurl, char* myxpath, char** myarray) {

//code that retrieve with cURL the XML and other stuff
//keyword contain data, that are copied into myarray

myarray = malloc(20 * sizeof(char*));
for (i=0; i < nodeset->nodeNr; i++) {
keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
myarray[i] = malloc((100) * sizeof(char));
strcpy(myarray[i], keyword);
// if I printf("%s\n", myarray[i]) here I can see that array is actually filled
xmlFree(keyword);
}

最佳答案

您正在将 myarray 的副本传递给 xmlretrive。如果你想改变 myarray 指向 xmlretrive 的内容,你需要传递一个指向它的指针。即 char***

void xmlretrive(char* myurl, char* myxpath, char*** myarray) {
*myarray = malloc(20 * sizeof(char*));
for (i=0; i < nodeset->nodeNr; i++) {
keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
(*myarray)[i] = malloc(strlen(keyword)+1);
if ((*myarray)[i] == NULL) {
// out of memory. print error msg then exit
}
strcpy((*myarray)[i], keyword);
xmlFree(keyword);
}

请注意,我还建议对您的 malloc 行进行一些更改

  • shouldn't cast the return from malloc
  • 分配 keyword 所需的字符串的确切长度以避免 strlen(keyword)>99
  • 缓冲区溢出的可能性
  • sizeof(char) 保证为 1,因此您无需将分配大小乘以它

这将解决您眼前的问题,但可能不足以让事情正常进行。其他一些需要考虑的事情:

  • main 需要为每个分配给 myarray 的成员以及 myarray 本身调用 free
  • 您无法让main 知道myarray 的长度。您可以将单独的 length 参数传递给 xmlretrive 或更改 xmlretrive 以在末尾添加 NULL 元素数组并迭代直到你在 main
  • 中找到它
  • xmlretrive 应该可能为 nodeset->nodeNr + 1(+1 假定您向数组添加了一个 NULL 终止符)元素分配空间而不是硬编码 20 的长度

关于c - 使用 malloc 从 main 打印在函数中创建的字符串数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17145412/

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