2014-09-02 54 views
-1

我想做一个排序函数来排序浮点值不兼容指针的顺序。当你运行代码时,在输入指针数组的大小并输入值之后,运行刚刚停止。我不知道问题出在哪里,任何人都可以提供帮助。 我已经纠正了警告,但现在仍然导致运行该代码排序功能不工作,模拟不能继续

#include <stdio.h> 
#include <stdlib.h> 

void sort(const int size, float *input, float *output); 


int main(void) { 
    int a; 

    float *b=&b1; 

    float *c=&c1; 
    int i, i1; 

    printf("input the size\n"); 
    scanf("%d", &a); 
    b=(float*)malloc(sizeof(int)*a); 
    c=(float*)malloc(sizeof(int)*a); 
    for(i=0; i<a ; i++){ 
     scanf("%f", &b[i]); 

    } 
    for(i1=0; i1<a; i1++){ 
     c[i1]=b[i1]; 
     printf("%f\n", c[i1]); 
    } 

    sort(10, b, c); 
    free(b); 
    free(c); 
    return 0; 
} 

void sort(const int size, float *input, float *output) 
{ 
    void swap(float *element1Ptr, float *element2Ptr); 
    int pass; 
    int j; 
    int i0; 

    for (pass=0; pass<size-1;pass++) 
    { 
     for (j=0; j<size-1;j++){ 
      if(input[j]>input[j+1]){ 

      swap(&input[j], &input[j+1]); 
      } 

     } 
    } 


    for (i0=0; i0<size; i0++){ 
     output[i0]=input[i0]; 
     printf("%f", output[i0]); 
    } 

} 

void swap(float *element1Ptr, float *element2Ptr) 
{ 
float hold=*element1Ptr; 
*element1Ptr=*element2Ptr; 
*element2Ptr=hold; 
} 
+2

先修复您的警告。 – wRAR 2014-09-02 10:00:29

+0

你为什么要为'float *'分配'int *'? – 2014-09-02 10:01:33

+1

[请不要在C]中输入'malloc()'的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – unwind 2014-09-02 10:02:46

回答

0

您定义的变量b具有类型float *

float *b=&b1; 

但尝试指派指针为int该变量

b=(int*)malloc(sizeof(int)*a); 

首先,有在B

的初始化没有意义
float *b=&b1; 

其次似乎你想分配一个数组彩车。所以你必须写

b = (float *)malloc(sizeof(float) * a); 

你也没有分配内存指向c。所以这个代码

for(i1=0; i1<a; i1++){ 
    c[i1]=b[i1]; 
    printf("%f\n", c[i1]); 
} 

sort(10, b, c); 

是无效的,程序有未定义的行为。目前还不清楚为什么你在排序中使用幻数10而不是变量a。

定义变量b1和c1有什么意义?

float b1=0; 
float c1=0; 

看来他们没有使用。

1

修复1:首先你要分配两条浮法地址指针cd -

float *b=&b1; 

float *c=&c1; 

那你就为它分配内存。它根本没有意义。当您分配内存时,新分配的内存地址将返回到指针bc

如果您想让0分配给所有分配的内存,您可以使用calloc来分配内存。因为它将分配内存和在它清除数据,并给它用户

float *b= (float *)calloc(a,sizeof(float)); 

float *c= (float *)calloc(a,sizeof(float)); 

修复2:你具有浮动指针。但分配内存后你的类型转换内存int * -

float *b=&b1; 

b=(int*)malloc(sizeof(int)*a); // don't do this 

而是使用 -

b=malloc(sizeof(float)*a); 

修复3:采用了内存分配为float *c你给它赋值 -

for(i1=0; i1<a; i1++){ 
    c[i1]=b[i1]; // note here. you have not allocated memory for c before 
    printf("%f\n", c[i1]); 
} 

为内存分配float *c并执行此操作。

c = malloc(sizeof(float)*a); 

一个简单的程序来完成你的工作 -

#include <stdio.h> 
#include <stdlib.h> 
void sort(const int size, float *input); 

int main(void) { 
     int a,i; 
     float *b; 

     printf("input the size\n"); 
     scanf("%d", &a); 
     b=(float*)malloc(sizeof(float)*a); 
     for(i=0; i<a ; i++){ 
       scanf("%f", &b[i]); 
     } 

     sort(a, b); 

     for (i=0; i<a; i++) 
       printf("%f\n",b[i]); 

     free(b); 
     return 0; 
} 

void sort(const int size, float *input) 
{ 
     int pass,j,temp; 
     for (pass=0; pass<size-1;pass++) 
     { 
       for (j=0; j<size-1;j++){ 
         if(input[j]>input[j+1]){ 
           temp = input[j]; 
           input[j]=input[j+1]; 
           input[j+1]=temp; 
         } 
       } 
     } 
} 

不要使用不必要的变量,其他那么重要的!如果你想要一个你的输入的副本,将它复制到另一个数组,并在输出数组上进行排序,而不是在输入数组上进行排序!

1

您的代码中存在一些错误。

没有内存分配给c。您在sort中修改了输入数组。

打印一张环环分至10

另外,我清理了格式化一下。

我移动前向声明,以便它在排序函数之外。不是一个错误,但程序员期望前置声明放在任何函数之外。

我删除了不必要的printf语句并只打印排序的数组。

#include <stdio.h> 
#include <stdlib.h> 

void sort(const int size, const float *input, float *output); 
void swap(float *element1Ptr, float *element2Ptr); 


int main(void) { 
    int a; 
    float *b; 
    float *c; 
    int i, i1; 

    printf("input the size\n"); 
    scanf("%d", &a); 
    b = malloc(sizeof(float)*a); 
    c = malloc(sizeof(float)*a); 

    for(i=0; i<a ; i++){ 
     scanf("%f", &b[i]); 
    } 
    sort(a, b, c); 

    for(i1=0; i1<a; i1++){ 
     printf("%f\n", c[i1]); 
    } 

    free(b); 
    free(c); 
    return 0; 
} 

void sort(const int size, float const *input, float *output) 
{ 
    int pass; 
    int j; 
    int i0; 

    for (i0=0; i0<size; i0++){ 
     output[i0]=input[i0]; 
    } 

    for (pass=0; pass<size-1;pass++) 
    { 
     for (j=0; j<size-1;j++){ 
      if(output[j]>output[j+1]){ 
       swap(&output[j], &output[j+1]); 
      } 
     } 
    } 
} 

void swap(float *element1Ptr, float *element2Ptr) 
{ 
    float hold=*element1Ptr; 
    *element1Ptr=*element2Ptr; 
    *element2Ptr=hold; 
} 

一般建议:

调高编译器的警告级别。编译器警告是有原因的。