0

我试图在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 是必须的?

4

2 回答 2

2

是的,您的代码已损坏。

您无法检查作为const char *using传递给函数的字符串的长度sizeof,您需要调用strlen(),并为终止符加 1 以计算内存的大小malloc()

的值sizeof *res_name是恒定的,简单地说sizeof (char),即 1。因此,您正在疯狂地覆盖内存,这会导致未定义的行为。

于 2013-07-08T14:49:28.470 回答
1

这看起来不对:

*searchEnginesNamesQueue[searchEnginesNamesQueue_ItemsCount] = malloc(sizeof(*res_name));

您没有显示类型定义,但前导*高度可疑。你真的想在那里取消引用吗?如果这故意的,那么它看起来像是在下一行和其他地方丢失了。

此外,这不是获取字符串长度的方法。改为使用strlen

尝试这个:

searchEnginesNamesQueue[searchEnginesNamesQueue_ItemsCount] = malloc(strlen(res_name)+1);
于 2013-07-08T15:58:25.953 回答