дамп стека с использованием alloc - PullRequest
1 голос
/ 04 июня 2009

Я, кажется, получаю дамп стека в моей функции, где я выделяю память.

Я передаю массив указателей '** output' в мою функцию. И затем я выделяю достаточно памяти, чтобы присвоить этой памяти строку. Однако я получаю дамп стека.

Большое спасибо за любые предложения,

void display_names(char **names_to_display, char **output);

int main(void)
{
    char *names[] = {"Luke", "John", "Peter", 0};
    char **my_names = names;
    char **new_output = 0;

    while(*my_names)
    {
        printf("Name: %s\n", *my_names++);
    }

    my_names = names; /* Reset */
    display_names(my_names, new_output);

    // Display new output
    while(*new_output)
    {
        printf("Full names: %s\n", *new_output++);
    }

    getchar();

    return 0;
}

void display_names(char **names_to_display, char **output)
{
    while(*names_to_display)
    {   
        // Stack dump here
        *output = (char*) malloc(sizeof("FullName: ") + strlen(*names_to_display)); // Allocate memory

        // Copy new output
        sprintf(*output, "FullName: %s", *names_to_display++);
        printf("display_names(): Name: %s\n", *output++);
    }   
}

======================== Обновлено ====================== ==

void display_names(char **names_to_display, char **output);

int main(void)
{
    char *names[] = {"Luke", "John", "Peter", 0};
    char **my_names = names;
    char *new_output[] = {0};
    size_t i = 0;

    while(*my_names)
    {
        printf("Name: %s\n", *my_names++);
    }

    my_names = names; /* Reset */
    display_names(my_names, new_output);

    // Stack dump here.
    while(*new_output[i])
    {
        printf("Full names: %s\n", *new_output[i]);
        i++;
    }

    getchar();

    return 0;
}

void display_names(char **names_to_display, char **output)
{
    while(*names_to_display)
    {   
        *output = malloc(strlen("FullName: ") + strlen(*names_to_display) + 1); // Allocate memory

        // Copy new output
        sprintf(*output, "FullName: %s", *names_to_display++);
        printf("display_names(): Name: %s\n", *output++);
    }   
}

Ответы [ 2 ]

4 голосов
/ 04 июня 2009

У вас есть многочисленные ошибки, но главная из них заключается в том, что вы передаете нулевой указатель на display_names:

char **new_output = 0;   // null pointer
...
display_names(my_names, new_output);

display_names затем разыменовывает его:

*output = (char*) malloc(sizeof("FullName: ") 
             + strlen(*names_to_display)); // Allocate memory

в результате чего задира.

Кроме того, указанное выше распределение недостаточно велико - вы хотите добавить 1 в конце маркера строки, и вам никогда не инициализируется выделенная память. Кроме того, это плохая привычка - использовать sizeof для строк символов - в этом случае это будет работать, но вы всегда должны использовать strlen.

1 голос
/ 04 июня 2009

Вы не можете оценить * выход , потому что вы передали output = null (в основном, ******* newoutput = 0 *).

Вы можете исправить это, протестировав, сколько у вас строк и наибольшую из них strlen, и начните с выделения фрагмента для output перед входом в цикл sprintf.

В качестве дополнительного комментария, где вы освобождаете этот кусок? Не отвечайте "но я выхожу сразу" ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...