c - 使用宏获取结构体中的数组长度

标签 c arrays struct macros

我有一些 C 代码来练习快速排序。我想使用宏来获取数组的长度。该宏在 main() 中运行良好功能。但是当我在排序函数中使用宏时,它不返回数组的长度。 请参阅我留下的代码中的注释。

另外,我想使用struct来创建名为“sort”和“quick_sort”的成员函数指针。任何擅长c编程的人都可以给我一些建议,看看我是否有一些可以改进的地方,无论语法、代码格式如何。我对结构内部的 sort 和 fast_sort 函数格式感到有点奇怪。我的目的是使用数组结构来调用函数。

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

#define NELEMS(a) (sizeof(a) / sizeof(a[0]))

typedef struct _Array Array;
struct _Array
{
    void (*sort)(int* arr); 
    void (*quick_sort)(int* arr, int l, int r);
};

void sort(int* arr);
void sort(int* arr)
{
    // Issues here.
    // The len is 2 not 5.
    // the macro returns the sizeof arr here is 8, not 20.
    int len = NELEMS(arr);
    if(len == 0){
        return;
    }
    void quick_sort(int* arr, int l, int r);
    quick_sort(arr, 0, len-1);
}

void quick_sort(int* arr, int l, int r)
{
    int j;
    if(l < r)
    {
        j = partition(arr, l, r);
        quick_sort(arr, l, j - 1);
        quick_sort(arr, j+1, r);
    }
}

int partition( int* a, int l, int r) {
    int pivot, i, j, t;
    pivot = a[l];
    i = l; j = r+1;

    while( 1)
    {
        do ++i; while( a[i] <= pivot && i <= r );
        do --j; while( a[j] > pivot );
        if( i >= j ) break;
        t = a[i]; a[i] = a[j]; a[j] = t;
    }
    t = a[l]; a[l] = a[j]; a[j] = t;
    return j;
}

void print_array(int* array, int len){
    int i;
    for(i = 0; i < len; i++)
        printf("%d, \n", array[i]);
}

int main(int argc, char const *argv[])
{
    int nums[5] = {5, 1, 3, 2, 4};
    // len is 20 / 4 = 5. It works fine.
    int len = NELEMS(nums); 
    Array *array = malloc(sizeof(Array));
    array->sort = sort;
    array->quick_sort = quick_sort;
    sort(nums);
    print_array(nums, NELEMS(nums));
    return 0;
}

最佳答案

该宏在 main 中工作,因为 nums 是一个数组,sizeof(nums) 获取数组的大小。

但是,当它作为函数参数传递时,它会自动转换为指针。在sort()中,sizeof(nums)仅获取指针的大小。

您可以通过显式传递数组的大小来修复它。

关于c - 使用宏获取结构体中的数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31911766/

相关文章:

c - 压缩包中的 PaxHeaders

c - C 语言智能编辑器程序

c - 它正在编译但每次都崩溃

ios - FTPKit 中止(取消)FTP 操作

c++ - 字符数组初始化的区别

javascript - 将数组从 NodeJS 服务器传递到客户端?

.net - 为什么在using语句内的闭包内捕获可变结构变量会改变其局部行为?

struct - Racket 契约(Contract)和结构问题

javascript - 基本的 javascript json 子数组解码

c - int数组到C中的struct数组