我有分段错误,但我没有找到oO? [英] I've got a segmentation fault but I dont find oO?
问题描述
Valgrind显示失败是从array2分配的,它在void merge中的第3个while循环中读写。
void merge(int * array,int start,int middle ,int end){
int size = end - start + 1;
int * array2 = malloc(size * sizeof(array2));
int k = start;
int m = middle + 1;
int i = 0;
int j = 0;
while(k <= middle&& m< = end){
if(array [k] <= array [m]){
array2 [i] = array [k];
k ++;
}
else {
array2 [i] = array [m];
m ++;
}
i ++;
}
while(k <= middle){
array2 [i] = array [k];
k ++;
i ++;
}
while(m <= end){
array2 [i] = array [k];
k ++;
i ++;
}
while(j< i){
array [start + j -1] = array2 [j];
j ++;
}
free(array2);
}
void merge_sort(int * array,int first,int last){
int middle;
if(first< last){
middle =((first + last)/ 2);
merge_sort(array,first,middle);
merge_sort(array,middle + 1,last);
merge(array,first,middle,last);
}
}
int main(int argc,char * argv [])
{
if(argc!= 3){
printf(usage:%s< maximale anzahl>< dateipfad> \\\
,argv [0]);
exit(2);
}
char * filename = argv [2];
int * array;
int size = atoi(argv [1]);
array = malloc(size * sizeof(array));
int len = read_array_from_file(array,atoi(argv [1]),filename);
printf(Eingabe:\\\
);
print_array(array,len);
merge_sort(array,array [0],len);
printf(Sortiert:\\\
);
print_array(array,len);
free(array);
return 0;
}
至少这是错误的:
int * array2 = malloc(size * sizeof(array2));
我想你的意思是:
int * array2 = malloc(size * sizeof(* array2));
您要分配 size
的每个条目,而不是数组指针的大小。
但是(在64位机器上)这实际上会使您的数组的字节数减半,导致您的超支发生得更早。您有一个逻辑错误,您需要通过使用调试器遍历代码来弄清楚。
It should sort with merge. There are two functions the merge and the sort merge. Some not known functions (read array from file and print array) are totally functional in an input file.
Valgrind show me that the failure is at the allocation from array2 and when it read and write at the 3rd while-loop in void merge.
void merge(int* array, int start, int middle, int end) {
int size = end - start + 1;
int *array2 = malloc(size*sizeof(array2));
int k = start;
int m = middle + 1;
int i = 0;
int j = 0;
while ( k <= middle && m <= end ) {
if ( array[k] <= array[m] ) {
array2[i] = array[k];
k++;
}
else {
array2[i] = array[m];
m++;
}
i++;
}
while ( k <= middle ) {
array2[i] = array[k];
k++;
i++;
}
while ( m <= end ) {
array2[i] = array[k];
k++;
i++;
}
while ( j < i ) {
array[ start + j -1 ] = array2[j];
j++;
}
free(array2);
}
void merge_sort(int* array, int first, int last) {
int middle;
if ( first < last ) {
middle = ((first+last) / 2);
merge_sort (array, first, middle);
merge_sort (array, middle + 1, last);
merge (array, first, middle, last);
}
}
int main (int argc, char *argv[])
{
if (argc!=3) {
printf ("usage: %s <maximale anzahl> <dateipfad>\n", argv[0]);
exit(2);
}
char *filename = argv[2];
int *array;
int size = atoi(argv[1]);
array = malloc(size*sizeof(array));
int len = read_array_from_file(array, atoi(argv[1]), filename);
printf("Eingabe:\n");
print_array(array, len);
merge_sort(array, array[0], len);
printf("Sortiert:\n");
print_array(array, len);
free(array);
return 0;
}
At least this is wrong:
int *array2 = malloc(size*sizeof(array2));
I think you mean:
int *array2 = malloc(size * sizeof(*array2));
You want to allocate size
times the size of each entry, not the size of the array pointer.
But (on a 64-bit machine) this will actually make your array half the number of bytes, causing your overrun to happen sooner. You have a logic error that you need to figure out by stepping through your code with a debugger.
这篇关于我有分段错误,但我没有找到oO?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!