使用alloc进行堆栈转储

时间:2009-06-04 10:24:47

标签: c

我似乎在我的函数中获取堆栈转储,我正在分配内存。

我将一个指针'** 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 个答案:

答案 0 :(得分:4)

你有很多错误,但主要的是你将一个指针传递给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 :(得分:1)

您无法评估 *输出,因为您已传递 output = null (在主要内容中,******* newoutput = 0 * )。

您可以在进入sprintf循环之前,通过测试您拥有的字符串数量以及最大的字符串来开始修复,然后将字符串分配给输出

作为旁注,你在哪里释放那块?不要回答“但我正在退出”......