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