【问题标题】:realloc - converting int to charrealloc - 将 int 转换为 char
【发布时间】:2011-02-25 14:07:28
【问题描述】:

我通过遍历整个数组将整数数组转换为字符,然后将生成的字符串添加到 ncurses 的方法 new_item。出于某种原因,我在reallocate 内存的方式上做错了,因此我得到的第一列是:

-4 Choice 1                 0 Choice 1
 4 Choice 2                 1 Choice 1
 4 Choice 3  - Instead of - 2 Choice 1
 4 Choice 4                 3 Choice 1
 4 Exit                     4 Choice 1

-

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <menu.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define CTRLD     4

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                  };
int table[5]={0,1,2,3,4}; 
int main()
{    ITEM **my_items;
    int c;              
    MENU *my_menu;
    int n_choices, i;
    ITEM *cur_item;

    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    n_choices = ARRAY_SIZE(choices);
    my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));

    char *convert = NULL;
    for(i = 0; i < n_choices; ++i){
        convert = (char *) malloc ( sizeof(char) * 4);
        sprintf(convert, "%i", table[i]); 
        my_items[i] = new_item(convert, choices[i]);
    }
    my_items[n_choices] = (ITEM *)NULL;

    my_menu = new_menu((ITEM **)my_items);
    mvprintw(LINES - 2, 0, "F1 to Exit");
    post_menu(my_menu);
    refresh();

    while((c = getch()) != KEY_F(1))
    {   switch(c)
        {   case KEY_DOWN:
                menu_driver(my_menu, REQ_DOWN_ITEM);
                break;
            case KEY_UP:
                menu_driver(my_menu, REQ_UP_ITEM);
                break;
        }
    }

    char *n = NULL, *d = NULL;

    unpost_menu(my_menu);
    free_menu(my_menu);
    for(i = 0; i < n_choices; ++i){
       n = (char *) item_name (my_items[i]);
       free (n);
       d = (char *) item_description (my_items[i]);
       free (d);
       free_item(my_items[i]);
    }

    free(my_items);
    endwin();
}

**更新:已修复。见上面的代码!

【问题讨论】:

    标签: c string ncurses realloc


    【解决方案1】:

    您一次又一次地尝试realloc 相同大小的相同内存块,realloc 只返回相同的内存块。因此,您将覆盖 convert 的早期值,并在所有项目中存储相同的 char 数组。

    你应该改用malloc

    // right here
    char *convert = NULL;
    for(i = 0; i < n_choices; ++i){
        convert = (char *) malloc (sizeof(char) * 4);
        sprintf(convert, "%i", table[i]); 
        my_items[i] = new_item(convert, choices[i]);
    }
    

    【讨论】:

    • 我确实做到了,(参见上面的代码)但是 valgrind 在 4 个块中抛出 16 个字节肯定会丢失在 0x4023D6E 的 21 个丢失记录 4 中:malloc (vg_replace_malloc.c:207)
    • @Mike:你还必须清理你分配的所有内存。
    • @Jonathan Leffler:我是否遗漏了一些需要清理的东西?我正在释放转换
    • @Mike:你只释放了分配给convert的最后一个值;您需要清理每个值 - 通过new_item() 函数分配给my_items[i] 的值。我不确定你是怎么做的;我不熟悉这个特定的new_item()。但是由于您多次循环循环,每次分配,但只释放一次,您肯定会泄漏内存(或者,可能是双重释放 - 但 Valgrind 说您正在泄漏,而不是双重释放)。
    • @Jonathan Leffler:谢谢,正如你所说,我并没有释放每个值。
    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2015-12-18
    • 2017-04-25
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多