程序运行正常,除了最后一个空闲,这会导致程序冻结。
当我评论最后一个“免费”时,它运行良好。
程序从字符串中获取所有子字符串并返回它。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** getPrefixes(char* invoer);

int main()
{
    char buffer[100];
    char *input;
    char **prefixes;
    int counter = 0;

    puts("Give string.");
    fgets(buffer, 99, stdin);
    fflush(stdin);

    if (buffer[strlen(buffer) - 1] == '\n')
        buffer[strlen(buffer) - 1] = '\0';

    input= (char*)malloc(strlen(buffer) + 1);

    if (input == NULL)
    {
        puts("Error allocating memory.");
        return;
    }

    strcpy(input, buffer);

    prefixes = (char**) getPrefixes(input);

    for (counter = strlen(input); counter > 0;  counter--)
    {
        puts(prefixes[counter]);
        free(prefixes[counter]);
    }

    free(input);

    free(prefixes);
}

char** getPrefixes(char* input)
{
    char** prefixes;
    int counter;

    prefixes = malloc(strlen(input) * sizeof(char*));

    if (prefixes == NULL)
    {
        puts("ELM.");
        return NULL;
    }


    for (counter= strlen(input); counter> 0; counter--)
    {
        prefixes[counter] = (char*)malloc(counter + 1);
        strcpy(prefixes[counter], input);
        input++;
    }

    return prefixes;
}

提前谢谢!

最佳答案

程序冻结的原因很简单:未定义的行为+无效的返回值:_您的主函数返回void,而不是int:请尽快添加return 0!如果在执行编译后的二进制文件后在控制台中键入echo $?,则应看到0以外的数字。这是程序的退出代码。除了0以外的任何东西都意味着麻烦。如果main没有返回int,那就是坏消息。
下一步:
未定义的行为出现在几个地方,例如这里:

prefixes = malloc(strlen(input) * sizeof(char*));
//allocate strlen(input) pointers, if input is 10 long => valid indexes == 0-9
for (counter= strlen(input); counter> 0; teller--)
{//teller doesn't exist, so I assume you meant "counter--"
    prefixes[teller] = (char*)malloc(counter + 1);//first call prefixes[10] ==> out of bounds
    strcpy(prefixes[counter], input);//risky, no zero-termination... use calloc + strncpy
    input++;
}

然后,在释放内存时,不会释放指针@offset 0,因此free(prefixes)调用无效:
for (counter = strlen(input); counter > 0;  counter--)
{//again 10 --> valid offsets are 9 -> 0
    puts(prefixes[counter]);
    free(prefixes[counter]);
}
free(prefixes);//wrong

同样,有效索引是0和up,循环中的条件(counter > 0)意味着只要counter为0,循环就会中断。在任何情况下,都不能释放数组中的第一个指针,即index/offstet 0处的指针。
像大家一样写循环:
for (int i=0, size_t len = strlen(input); i<len; ++i)
{
    printf("%d\n", i);//prints 0-9... 10 lines, all valid indexes
}

改变你的循环,并确保你只使用有效的偏移,你应该很好去。使用strncpy,仍然可以得到与以前相同的结果:
for (int i=0;i<len;++i)
{
    //or malloc(i+2), char is guaranteed to be 1
    //I tend to use `calloc` to set all chars to 0 already, and ensure zero-termination
    prefixes[i] = malloc((i+2)*sizeof(*prefixes[i]));
    strncpy(prefixes[i], input, i+1);//max 1 - 10 chars are copied
}

如果我们将此应用于您的代码,并像这样重新编写:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** getPrefixes(char* input);

int main( void )
{
    char *input;
    char **prefixes;
    int counter, i;

    input= calloc(50,1);
    if (input == NULL)
    {
        puts("Error allocating memory.");
        return;
    }
    strcpy(input, "teststring");

    prefixes = getPrefixes(input);
    counter = strlen(input);
    for (i=0; i<counter;++i)
    {
        puts(prefixes[i]);
        free(prefixes[i]);
    }

    free(input);
    free(prefixes);
    return 0;
}

char** getPrefixes(char* input)
{
    int i, counter = strlen(input);
    char** prefixes = malloc(counter * sizeof *prefixes);

    if (prefixes == NULL)
    {
        puts("ELM.");
        return NULL;
    }

    for (i=0; i<counter; ++i)
    {
        prefixes[i] = calloc(i + 2,sizeof *prefixes[i]);
        strncpy(prefixes[i], input, i+1);
    }
    return prefixes;
}

我们得到的结果是:
t型
te公司
测试
测试
测验
测试
测试字符串
睾丸
睾丸素
测试字符串
如你所见
on this codepad

10-08 04:18
查看更多