下面是我寫的一個C程序,用於打印字符串中不同字符的組合。free from malloc
這不是一種有效的方法,因爲這種算法創造了很多額外的字符串。然而,我的問題不是關於如何更有效地解決這個問題。
該程序工作(效率低下),並打印字符串(正確)的不同組合。但是,當我嘗試free
額外的字符串正在創建我遇到問題。導致問題的free
在thr recur_printc
函數(它被評論)的末尾。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 3
void recur_printc(char *, int, char *);
int main()
{
char str[] = "abc";
char *print_arr = malloc(N * sizeof(char));
//Call recur_print
recur_printc(print_arr, 0, str);
free(print_arr);
return 0;
}
void recur_printc(char *print_arr, int index, char *remaining)
{
int i, j, rem_len, index_4_next;
//base case, only last cahracter remaining
if(strlen(remaining) == 1)
{
print_arr[index] = remaining[0];
//Print the print_arr
for(i=0; i<N; i++)
{
printf("%c",print_arr[i]);
}
printf("\n");
return;
}
//If more than one character remaining
else
{
rem_len = strlen(remaining);
for(i=0; i<rem_len; i++)
{
//Add one character to print_arr
print_arr[index] = remaining[i];
//now create the string with remaining characters
char *remaining_for_next = malloc((rem_len-1) * sizeof(char));
index_4_next = 0;
for(j=0; j<rem_len; j++)
{
if(j != i)
{
remaining_for_next[index_4_next] = remaining[j];
index_4_next++;
}
}
//call recur_print
recur_printc(print_arr, index+1, remaining_for_next);
//Free the remainin_for_next
/*------This is causing issues----*/
//free(remaining_for_next);
remaining_for_next = NULL;
}
}
}
當我在gdb
跑了這個節目,我注意到,當i=1
爲recur_print
第一個實例,一個奇怪的事情發生與malloc
。
當執行該行:
char *remaining_for_next = malloc((rem_len-1) * sizeof(char));
雖然rem_len-1
等於2
,malloc的分配3
字節,然後整個算法失敗怎麼一回事,因爲在該串的碼strlen
的某處被使用(這將是3而不是2)。 。不知道發生了什麼事(當我註釋掉free()
線不會出現這種情況)
下面是GDB輸出:
42 char *remaining_for_next = malloc((rem_len-1) * sizeof(char));
(gdb) print remaining_for_next
$3 = 0x0
(gdb) n
43 index_4_next = 0;
(gdb) print remaining_for_next
$4 = 0x602030 "@ `"
(gdb) print rem_len-1
$5 = 2
(gdb) q
很抱歉的長期職位。再次,我的問題不是關於如何以不同(更好)的方式打印聯合。我的問題是,當我嘗試釋放remaining_for_next
字符串(可能爲什麼malloc受到影響)時,上述代碼失敗的原因。
「*免費導致問題... *」如果處理動態分配的內存導致問題,您可能想轉向使用內存檢查工具,如Valgind(https://valgrind.org)。 – alk