提问人:weito 提问时间:11/22/2022 最后编辑:weito 更新时间:11/22/2022 访问量:93
C 在函数中分配内存后无法释放内存
C can't free memory after allocating it in function
问:
我正在开发一个程序,用于比较插入和计数排序的运行时和步骤。 除了一件事之外,一切都正常,对于countsort,我必须使用malloc初始化一个额外的数组。
我的问题是我无法弄清楚如何或在哪里为我的 . (我对 C 语言相当陌生) malloc 命令位于第 47 行的“count_sort”函数中。
count_array
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include "introprog_complexity_steps_input.h"
const int MAX_VALUE = 5000000;
void count_sort_calculate_counts(int input_array[], int len, int count_array[], unsigned int* befehle) {
// Muss implementiert werden
int s = 0;
*befehle = *befehle + 1; //1 Befehl für Zuweisung von s
*befehle = *befehle + 1; //1 Befehl für Zuweisung von i
for(int i = 0; i < len; i++){
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (i < len) = true
*befehle = *befehle + 1; //1 Befehl für i++
s = input_array[i];
*befehle = *befehle + 1; //1 Befehl für Zuweisung von s = input_array[i]
count_array[s] = count_array[s] + 1;
*befehle = *befehle + 1; //1 Befehl für die Rechnung count_array[s] = count_array[s] + 1
}
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (i < len) = false
}
void count_sort_write_output_array(int output_array[], int len, int count_array[], unsigned int* befehle) {
// Muss implementiert werden
int k = 0;
*befehle = *befehle + 1; //1 Befehl für Zuweisung von k
*befehle = *befehle + 1; //1 Befehl für Zuweisung von j
*befehle = *befehle + 1; //1 Befehl für Zuweisung von i
for(int j = 0; j <= MAX_VALUE; j++){
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (j <= MAX_VALUE) = true
*befehle = *befehle + 1; //1 Befehl für j++
for(int i = 0; i < count_array[j]; i++){
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (i < count_array[j]) = true
*befehle = *befehle + 1; //1 Befehl für i++
output_array[k] = j;
*befehle = *befehle + 1; //1 Befehl für Zuweisung von output_array[k] = j
k = k + 1;
*befehle = *befehle + 1; //1 Befehl für die Rechnung k = k + 1
}
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (i < count_array[j]) = false
}
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (j <= MAX_VALUE) = false
}
void count_sort(int array[], int len, unsigned int* befehle) {
// Muss implementiert werden
int* count_array = malloc(sizeof(int) * MAX_VALUE);
count_sort_calculate_counts(array, len, count_array, befehle);
count_sort_write_output_array(array, len, count_array, befehle);
}
void insertion_sort(int array[], int len, unsigned int* befehle) {
// Muss implementiert werden
int key;
int i;
*befehle = *befehle + 1; //1 Befehl für Zuweisung von key
*befehle = *befehle + 1; //1 Befehl für Zuweisung von i
*befehle = *befehle + 1; //1 Befehl für Zuweisung von j
for (int j = 1; j <len; j++){
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (j <len) = true
*befehle = *befehle + 1; //1 Befehl für j++
i = j;
*befehle = *befehle + 1; //1 Befehl für die zuweisung i = j;
key = array[j];
*befehle = *befehle + 1; //1 Befehl für die zuweisung key = array[j]
i = j - 1;
*befehle = *befehle + 1; //1 Befehl für die Rechnung i = j - 1
while (i >= 0 && array[i] > key){
*befehle = *befehle + 2; //2 Befehle für die Bedingungen (i >= 0 = true) und (array[i] > key) = true
array[i + 1] = array[i];
*befehle = *befehle + 1; //1 Befehl für die zuweisung array[i + 1] = array[i]
i = i - 1;
*befehle = *befehle + 1; //1 Befehl für die Rechnung i = i - 1;
}
*befehle = *befehle + 2; //2 Befehle für die Bedingung (i >= 0 = false) und (array[i] > key) = false
array[i+1] = key;
*befehle = *befehle + 1; //1 Befehl für die zuweisung array[i+1] = key
}
*befehle = *befehle + 1; //1 Befehl für die Überprüfung von (j <len) = false
}
int main(int argc, char *argv[]) {
const int WERTE[] = {10000,20000,30000,40000,50000};
const int LEN_WERTE = 5;
const int LEN_ALGORITHMEN = 2;
int rc = 0;
unsigned int befehle_array[LEN_ALGORITHMEN][LEN_WERTE];
double laufzeit_array[LEN_ALGORITHMEN][LEN_WERTE];
for(int j = 0; j < LEN_WERTE; ++j) {
int n = WERTE[j];
// Reserviere Speicher für Arrays der Länge n
int* array_countsort = malloc(sizeof(int) * n);
int* array_insertionsort = malloc(sizeof(int) * n);
// Fülle array_countsort mit Zufallswerten ..
fill_array_randomly(array_countsort, n, MAX_VALUE);
// ... und kopiere die erzeugten Werte in das Array
// array_insertionsort
copy_array_elements(array_insertionsort, array_countsort, n);
// Teste ob beide Arrays auch wirklich die gleichen Werte
// enthalten
if(!check_equality_of_arrays(array_countsort, array_insertionsort, n)) {
printf("Die Eingaben für beide Algorithmen müssen für die Vergleichbarkeit gleich sein!\n");
return -1;
}
for(int i = 0; i < LEN_ALGORITHMEN; ++i) {
unsigned int anzahl_befehle = 0;
start_timer();
// Aufruf der entsprechenden Sortieralgorithmen
if(i==0) {
count_sort(array_countsort, n, &anzahl_befehle);
} else if(i==1) {
insertion_sort(array_insertionsort, n, &anzahl_befehle);
}
// Speichere die Laufzeit sowie die Anzahl benötigter
// Befehle
laufzeit_array[i][j] = end_timer();
befehle_array[i][j] = anzahl_befehle;
}
// Teste, ob die Ausgabe beider Algorithmen gleich sind
if(!check_equality_of_arrays(array_countsort, array_insertionsort, n)) {
printf("Die Arrays sind nicht gleich. Eines muss (falsch) sortiert worden sein!\n");
rc = -1;
}
// Gib den Speicherplatz wieder frei
free(array_countsort);
free(array_insertionsort);
}
// Ausgabe der Anzahl ausgeführter Befehle sowie der gemessenen
// Laufzeiten (in Millisekunden)
printf("Parameter MAX_VALUE hat den Wert %d\n", MAX_VALUE);
printf("\t %32s %32s \n", "Countsort","Insertionsort");
printf("%8s \t %16s %16s \t %16s %16s \n", "n","Befehle", "Laufzeit","Befehle","Laufzeit");
for(int j = 0; j < LEN_WERTE; ++j) {
printf("%8d \t ",WERTE[j]);
for(int i = 0; i < LEN_ALGORITHMEN; ++i) {
printf("%16u %16.4f \t ", befehle_array[i][j], laufzeit_array[i][j]);
}
printf("\n");
}
return rc;
}
我试图在程序的几个点释放计数数组的内存。编译有效,但如果我运行程序,它会吐出分段错误。
此外,我尝试不使用 malloc 命令,而只是使用
int count_array[MAX_VALUE];
这也会导致分段错误。
答:
0赞
Cinverse
11/22/2022
#1
- 正如@AviBerger指出的,这可能是因为您正在访问 ,而最后一个合法可访问的元素是 。
count_array[MAX_VALUE]
MAX_VALUE-1
- 确保函数只填充数组中的非负整数,因为在函数中,在语句中,您正在访问 count_array 的元素,如果为负数,则可能会发出此错误。
fill_array_randomly
count_sort_calculate_counts
count_array[s] = count_array[s] + 1;
input_array[i]
input_array[i]
评论
1赞
weito
11/22/2022
3.在使用它之前,我必须用int数字填充count数组。< for(int i = 0; i < MAX_VALUE; i++) count_array[i] = 0;>
0赞
Cinverse
11/22/2022
@weito你可以使用 calloc
评论
for(int j = 0; j <= MAX_VALUE; j++){
可能应该是 这是一个常见的关闭错误,导致越界访问。它将越界访问count_array。for( int j = 0; j < MAX_VALUE; j++){
free(count_array)
应位于 的末尾。数组不会由它调用的任何一个函数保存,因此请在使用完它后释放它。count_sort()
count_sort()