【问题标题】:implementing strings queue in c: when do I have to use malloc在 c 中实现字符串队列:我什么时候必须使用 malloc
【发布时间】:2013-07-08 14:44:37
【问题描述】:

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

【问题讨论】:

  • 你需要检查你的代码的类型,“引擎”的拼写在几个地方是关闭的。

标签: c arrays memory queue malloc


【解决方案1】:

是的,您的代码已损坏。

您不能使用sizeof检查作为const char *传递给函数的字符串的长度,您需要调用strlen(),并为终止符加1来确定malloc()的内存。

sizeof *res_name 的值是常量,简单来说sizeof (char),即 1。所以你正在疯狂地覆盖内存,这会导致未定义的行为。

【讨论】:

    【解决方案2】:

    这看起来不对:

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

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

    另外,这不是获取字符串长度的方法。请改用strlen

    试试这个:

    searchEnginesNamesQueue[searchEnginesNamesQueue_ItemsCount] = malloc(strlen(res_name)+1);
    

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 2011-01-21
      • 2013-04-30
      • 1970-01-01
      • 2010-12-30
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多