我试图在c。
中实现字符串队列(使用数组排队)
但我的代码中有一个未知的苍蝇。
1)我尝试将一个字符串分配给队列。我的逻辑错了吗?
static void enqueueInSearchEngineQueue(const char* res_name) {
if (searchEnginesNamesQueue_ItemsCount <= SEASRCH_ENGINES_QUEUE_MAX_SIZE) {
*searchEnginesNamesQueue[searchEnginesNamesQueue_ItemsCount] = malloc(sizeof(*res_name));
strcpy(searchEnginesNamesQueue[searchEnginesNamesQueue_ItemsCount] ,res_name);
searchEnginesNamesQueue_ItemsCount++;
}
else
{
// freeSearchEngingeQueue();
}
}
static int existInSearchEngingeQueue(const char* res_name) {
int i = 0;
int answer = 0;
for (i; i < searchEnginesNamesQueue_ItemsCount; i++) {
if (strcmp(searchEnginesNamesQueue[i], res_name) == 0) {
answer = 1;
break;
}
}
return answer;
}
static void freeSearchEngingeQueue() {
int i = 0;
for (i; i < searchEnginesNamesQueue_ItemsCount; i++) {
free(searchEnginesNamesQueue[i]);
}
searchEnginesNamesQueue_ItemsCount = 0;
}
static void searchEnginesIcons_download_callback(const char* res_name,
int success, void *context, char *last_modified) {
if (success) {
if (!existInSearchEngingeQueue(res_name)) {
enqueueInSearchEngineQueue(res_name);
#ifdef ANDROID
DriveToNativeManager_refreshSearchEnginesIconsOnSearchActivity(res_name);
#elif defined(IPHONE)
//TODO
refreshIconsOnSearchActivity();
#endif
}
}
}
2)我的代码的其他部分的回调填满了队列。
我曾想过在堆栈上使用内存,它是否可行或者malloc是必须的?
答案 0 :(得分:2)
是的,您的代码已损坏。
您无法使用const char *
检查作为sizeof
传递给函数的字符串的长度,您需要调用strlen()
,并为终结符添加1以确定内存的方式到malloc()
。
sizeof *res_name
的值是常量,只是sizeof (char)
,即1.所以你会大量覆盖内存,导致未定义的行为。
答案 1 :(得分:1)
这看起来不对:
*searchEnginesNamesQueue[searchEnginesNamesQueue_ItemsCount] = malloc(sizeof(*res_name));
您没有显示类型定义,但前导*
非常可疑。你真的想在那里取消引用吗?如果 是故意的,那么它看起来就像在下一行和其他地方一样。
此外,这不是获取字符串长度的方法。请改用strlen
。
试试这个:
searchEnginesNamesQueue[searchEnginesNamesQueue_ItemsCount] = malloc(strlen(res_name)+1);