查找结构数组C的大小

时间:2018-02-11 01:39:16

标签: c arrays sorting size

我试图找到我用来对它进行排序的struct数组的大小。不知道如何使用通常在非结构数组中使用的sizeof()函数来实现它。

我还试图在参数和temp结构变量初始化车辆结构时弄清楚我做错了什么。

error: incompatible types when initializing type ‘struct data *’ using type ‘struct data’
struct data *temp = vehicles[j];

这是我正在使用的数据结构

struct data{

    char *model;
    float engineSize;
    int cost;
    char *color;
};

这是我正在运行的用于我正在使用的排序的代码

    void bubbleSortFloats(struct data vehicles[], int check)
    {
       int i, j, n;

       n = sizeof(vehicles)/sizeof(vehicles[0]);

      // If check == 1 then ascending sort
      if(check == 1){

       for (i = 0; i < n-1; i++){     

           // Last i elements are already in place   
           for (j = 0; j < n-i-1; j++){


               if (vehicles[j].engineSize > vehicles[j+1].engineSize){

                    struct data temp = vehicles[j];
                    vehicles[j] = vehicles[j+1];
                    vehicles[j+1] = temp; 

               }
            }
        }
      }
      // If check == 0 then decending sort
      if(check == 0){

        for (i = 0; i < n-1; i++){     

           // Last i elements are already in place   
           for (j = 0; j < n-i-1; j++){


               if (vehicles[j].engineSize < vehicles[j+1].engineSize){

                    struct data temp = vehicles[j+1];
                    vehicles[j+1] = vehicles[j];
                    vehicles[j] = temp; 

               }
            }
        }
      }

    }

这是我正在使用的readfile函数的更新

struct values * readFile(){

    FILE *fp;
    int c;
    int count = 0;
    char *line = NULL;
    size_t len = 0;

    fp = fopen("hw3.data", "r");


    while ((c = fgetc(fp)) != EOF){
        if(c == '\n'){
            count++;
        }

    }

    if (feof(fp)){

        rewind(fp);

        struct data *vehicles = malloc((sizeof(struct data))* count);


        count = 0;
        char *token = NULL;
        while (getline(&line, &len, fp)!= -1){

            printf("%s", line);

            token = strtok(line,  " ");

            vehicles[count].model = malloc(strlen(token) + 1);
            strcpy(vehicles[count].model, token);

            token = strtok(NULL, " ");
            vehicles[count].engineSize = atof(token);

            token = strtok(NULL, " ");
            vehicles[count].cost = atoi(token);

            token = strtok(NULL, " ");
            vehicles[count].color = malloc(strlen(token) + 1);
            strcpy(vehicles[count].color, token);

            free(line);
            line = NULL;
            len = 0;

        }
        struct values *value = malloc(sizeof(struct values));
    value.vehicles = vehicles;
    value.count = count;
    return value;
    }

3 个答案:

答案 0 :(得分:1)

此代码

sizeof(vehicles)/sizeof(vehicles[0]);

仅适用于 true 数组。

void bubbleSortFloats(struct data vehicles[], int check);

vehicles看起来像一个数组,但事实上它是一个指针,这个函数 定义与

相同
void bubbleSortFloats(struct data *vehicles, int check);

在C中,你不能将真正的数组传递给函数,它们总是作为传递 指针。即使使用这样的代码:

void foo(int arr[10])
{
    printf("%lu\n", sizeof arr / sizeof *arr);
}

int main()
{
    int arr[10] = { 0 };
    foo(arr);
}

我收到编译器的警告:

a.c: In function ‘foo’:
a.c:6:25: warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int *’ [-Wsizeof-array-argument]
  printf("%lu\n", sizeof arr);
                         ^~~
a.c:4:14: note: declared here
 void foo(int arr[10])
              ^~~

如果我执行它,我得到2,因为在我的系统上,指针的大小是8 并且int的大小为2.那就是sizeof arr / sizeof *arr没有的原因 在一个传递数组的函数中工作。

您必须先计算之前阵列的长度 bubbleSortFloats并将该长度传递给函数。正确的功能 将是:

void bubbleSortFloats(struct data *vehicles, size_t len, int check)
{
    ...
}

我们不知道你是如何创建数组的,但是创建它的函数会 知道大小:

void foo(void)
{
    struct data vehicles[SOME_LEN];
    ...

    bubbleSortFloats(vehicles, sizeof vehicles / sizeof *vehicles, check);
}

或者如果您使用malloc

进行了此操作
void foo(void)
{
    size_t len = ...;

    struct data *vehicles = malloc(len * sizeof *vehicles);
    if(vehicles == NULL)
        return;

    ...

    bubbleSortFloats(vehicles, len, check);
}

修改

  

Jeffrey Hennen在评论部分提出

     

我说清楚了。我想要为结构数组的大小返回结构和int计数

就像我在评论中所说的那样,如果你想要返回多个值,那么你就拥有了 基本上有两种选择:

  1. 声明一个封装所有返回值的结构并将其返回
  2. 或者传递指向函数的指针,让函数更新值 由指针提供。
  3. 你选择的方式1,所以我猜你有这个结构:

    struct values {
        struct data *vehicles;
        size_t count;
    };
    

    然后你回来的方式,没关系。当然你应该检查一下 最后malloc没有返回NULL(你在整个过程中忽略了这一点 但是,功能。

    第二个选项是:

    最简单的方法是:

    struct data *readFile(size_t *length) {
        if(length == NULL)
            return NULL;
    
        ...
        while (getline(&line, &len, fp)!= -1){
            ...
        };
    
        // NOT NEEDED ANYMORE
        //struct values *value = malloc(sizeof(struct values));
        //value.vehicles = vehicles;
        //value.count = count;
    
        *length = count; // UPDATE the length through the pointer
        return vehicles; // return the array
    }
    

    并且调用函数将执行:

    void foo(void)
    {
        size_t count;
        struct data *vehicles = readFile(&count);
        if(vehicles == NULL)
        {
            // error
            return;
        }
    
        do_something_with_the_vehicles(vehicles, count);
    
        free_the_vehicles(vehicles, count);
    }
    

    当然你必须写一个函数free_the_vehicles(你可以 当然选择另一个名称)释放所有分配的内存。

答案 1 :(得分:0)

 struct data *temp = &vehicles[j];

否则,当您尝试为结构指定指针时,它是不兼容的。您需要指定结构的地址

答案 2 :(得分:0)

复制结构时,直接赋值不起作用。

建议使用功能:memcpy()

memcpy( temp, &vehicles[j], sizeof( struct data );

对于试图复制“结构数据”的所有语句都存在类似的考虑因素。实例