c - 尝试运行一个排序 C 程序,该程序通过命令行(Mac 终端)接受输入
问题描述
尝试运行通过命令行(Mac 终端)接收输入的排序 C 程序。如果我手动输入数据,程序就可以工作。如果我从命令行输入数据(即 time ./hw2 mergesort < 10000.txt )我会得到错误:
hw2(1368,0x7fffcf79b3c0) malloc: * mach_vm_map(size=18446744065119617024) 失败(错误代码=3) *错误:无法分配区域 *** 在 malloc_error_break 中设置断点以调试错误: malloc 大小失败:-2147483648 真实1m41.341s 用户 1m38.316s 系统 0m2.406s
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_SIZE 1024
int merge_sort(int arr[],int low,int high);
int merge(int arr[],int l,int m,int h);
int* read_input(int* size)
// read input from stdin into array a; return size of array in size parameter
{
int *a = NULL;
int next = 0;
int sz = DEFAULT_SIZE;
a = malloc(sizeof(int) * sz);
if (a == NULL)
{
fprintf(stderr, "ERROR: malloc failed for size: %d\n", sz);
exit(1);
}
while (!feof (stdin))
{
int i = 0;
if (scanf ("%d", &i) == EOF)
{
break;
}
a[next++] = i;
// reached end of array--double size and allocate again;
if (next == sz)
{
sz = 2 * sz;
a = realloc(a, sizeof(int) * sz);
if (a == NULL)
{
fprintf(stderr, "ERROR: malloc failed for size: %d\n", sz);
exit(1);
}
}
}
*size = next;
printf("READ %d elements into array\n", next);
return a;
}
int merge_sort(int arr[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
// Divide and Conquer
merge_sort(arr,low,mid);
merge_sort(arr,mid+1,high);
// Combine
merge(arr,low,mid,high);
}
return 0;
}
int merge(int arr[],int l,int m,int h)
{
int arr1[10],arr2[10]; // Two temporary arrays to
// hold the two arrays to be merged
int n1,n2,i,j,k;
n1=m-l+1;
n2=h-m;
for(i=0;i<n1;i++)
arr1[i]=arr[l+i];
for(j=0;j<n2;j++)
arr2[j]=arr[m+j+1];
arr1[i]=9999; // To mark the end of each temporary array
arr2[j]=9999;
i=0;j=0;
for(k=l;k<=h;k++) //process of combining two sorted arrays
{
if(arr1[i]<=arr2[j])
arr[k]=arr1[i++];
else
arr[k]=arr2[j++];
}
return 0;
}
int do_merge_sort(int a[], int size)
{
printf("BEGIN merge_sort...\n");
merge_sort(a,0, size);
printf("END merge_sort...\n");
return 0;
}
int do_heap_sort(int a[], int size)
// heapsort driver function
{
printf("BEGIN heap_sort...\n");
// TO BE FILLED IN
printf("END heap_sort...\n");
return 0;
}
// qiocksort driver function
int do_quick_sort(int a[], int size)
{
printf("BEGIN quick_sort...\n");
// TO BE FILLED IN
printf("END quick_sort...\n");
return 0;
}
int usage()
{
char *usage_str =
"./hw2 [-h] mergesort|heapsort|quicksort\n"
"\n"
"Driver program to test different sort algorithn performance.\n"
"\n"
"Example\n"
"\n"
"./hw2 mergesort\n"
"\n"
"will test mergesrt\n"
;
fprintf(stderr, "%s\n\n", usage_str);
exit(1);
}
int main(int argc, char *argv[])
// driver function
{
int *a = NULL;
int size;
int ret = 0;
if (argc < 2)
{
fprintf(stderr, "ERROR: at least one argument needed\n");
usage();
}
// read the input into array;
a = read_input(&size);
if (strcmp(argv[1], "mergesort") == 0) {
do_merge_sort(a, size);
}
else if (strcmp(argv[1], "heapsort") == 0) {
do_heap_sort(a, size);
}
else if (strcmp(argv[1], "quicksort") == 0) {
do_quick_sort(a, size);
}
else {
fprintf(stderr, "ERROR: BAD argument\n");
usage();
}
// free allocated memory
if (a) {
free(a);
}
exit(0);
}
我使用这个 python 代码来生成随机数数据:
#! usr/env/bin python
# to generate random data:
# python ./gen_data.py 1 1000000 > 1000000.dat
#
# you can verify that data by
# cat 1000000.dat | sort -g >1000000s.dat
# vi 1000000s.dat
#
import sys
import random
start_num = int(sys.argv[1])
end_num = int(sys.argv[2])
data = range(start_num, end_num)
random.shuffle(data)
for x in range(len(data)):
# print(str(data[x]) + '\n')
print(data[x])
解决方案
可能没有满足循环的不再输入的结束条件。这导致 sz 重复加倍,直到作为 Int 循环回到负值。然后,您的内核抱怨它无法执行分配占用负空间的内存块的请求。
推荐阅读
- php - SendGrid 不发送电子邮件并返回 0 数组( [0] => )
- java - 无法使用 BubbleTextView
- javascript - 如何查看 select2 实例的设置选项?
- scala - Scala隐式转换误导
- java - “debuggable false”足以阻止调试我的应用程序?
- wpf - 并非所有样式都在我的 WPF 控件中被覆盖
- python - 如何在python3中打印带有0和*的图案
- node.js - 在使用 nextjs 进行反应编译时退出状态 1
- c# - 有没有办法让 Json.Net 反序列化为声明为“对象”的属性的具体类型
- sql - 如何编写查询/创建视图以限制多条记录仅显示最大值