macOS中的c分割错误;有时,有时不是 void makeDouble(int**a,int*size){ int i,j; *尺寸*=2; *a=(int*)realloc(*a,(*size)*sizeof(int)); 对于(i=0;i第一段故障

macOS中的c分割错误;有时,有时不是 void makeDouble(int**a,int*size){ int i,j; *尺寸*=2; *a=(int*)realloc(*a,(*size)*sizeof(int)); 对于(i=0;i第一段故障,c,segmentation-fault,malloc,C,Segmentation Fault,Malloc,这肯定会导致SEG故障的一个地方是: void makeDouble(int **a, int *size){ int i, j; *size *= 2; *a = (int *)realloc(*a, (*size)*sizeof(int)); for(i=0; i<*size/2; i++){ (*a)[*size/2+i] = (*a)[i] * 2; } int temp; for(i=0; i<*

这肯定会导致SEG故障的一个地方是:

  void makeDouble(int **a, int *size){
    int i, j;
    *size *= 2;
    *a = (int *)realloc(*a, (*size)*sizeof(int));
    for(i=0; i<*size/2; i++){
        (*a)[*size/2+i] = (*a)[i] * 2;
    }

    int temp;
    for(i=0; i<*size-1; i++){
        for(j=0; j<*size-i-1; j++){
            if((*a)[j]>(*a)[j+1]){
                temp = (*a)[j];
                (*a)[j] = (*a)[j+1];
                (*a)[j+1] = temp;
            }
        }
    }
}
如果您将一个字符而不是一个适合整数的数字传递给它,这将失败,因为scanf不会按大小写入

您必须检查
scanf
的返回,它是成功匹配的输入项目数:

int size;
scanf("%d", &size);
int* a = (int *)malloc(size*sizeof(int));
内存泄漏 如果
realloc
由于未能分配足够的空间而返回NULL,则会出现内存泄漏,因为:

if (scanf("%d", &size) != 1) {
    fprintf(stderr, "Supplied size is not a valid number.\n");
    return 1; 
}
此模式存在错误,因为将
realloc
的返回值分配给要重新分配的数组意味着您将丢失对已分配数组的引用,因为
a==NULL
。请执行以下操作:

int *a = realloc(a, ...);
堆损坏
您的函数
makeDouble
正在导致堆损坏,因为您正在访问和修改绑定外内存。我得到了一个
realloc()中止:glibc的下一个大小无效,因此您很可能正在粉碎运行时已分配的堆,但未到达下一页,因此没有Segfault和运行时错误。

您不应该强制转换
malloc
的结果,如果
realloc
返回
NULL
”*大小,您的程序也会泄漏/2+我不确定这是如何计算的。优先级/关联方面?@nullp0tr您是否认为第9行和第32行出现了此问题?那么我如何修复它?;(代码中还有很多其他问题,堆已损坏。
int *temp = realloc(a, ...);
if (temp == NULL) {
    free(a); // Or continue using it ..
} else {
    a = temp;
}