我试图编写一个泛型函数来获取整数或字符串数组中的最小元素.我正在使用记忆功能.以下是我写的代码:
编辑:修改过的代码 - 我从int size_t改变了int size
/* Write a function that returns minimum values of an array of integers or strings */ #include#include #include void returnMinAddress(void *a, void *b, int arr_size, int size) { b = a; for (int i = 0; i < arr_size; i++) { if (memcmp(b, a+((i)*size), size) < 0) { memmove(b, a+((i)*size), size); } } } int main() { void *b = malloc(sizeof(int)); /* For an array of type integer */ int a[8] = {3, 2, 1, -4, 6, 9, 8, -1}; returnMinAddress(a, b, 8, sizeof(int)); printf("The result is : %d\n", *(int *)b); free(b); return 0; }
花了很多时间后,我不明白为什么我一直把答案都改为0 ..以下是输出的截图.我在这里错过了什么?
原始代码:
#include#include #include void returnMinAddress(void *a, void *b, int arr_size, int size_t) { b = a; for (int i = 0; i < arr_size; i++) { if (memcmp(b, a+((i)*size_t), size_t) < 0) { memmove(b, a+((i)*size_t), size_t); } } } int main() { void *b = malloc(sizeof(int)); /* For an array of type integer */ int a[8] = {3, 2, 1, -4, 6, 9, 8, -1}; returnMinAddress(a, b, 8, sizeof(int)); printf("The result is : %d\n", *(int *)b); free(b); return 0; }
您的通用功能无效.
首先,虽然size_t
它不是关键字,但它是一个类型说明符.因此,将此单词用作标识符是一个坏主意.
这个说法
b = a;
应该换成
memmove( b, a, size_t );
其次根据C标准,您可能不会将指针算法应用于类型的指针,void *
因为类型void
是不完整的类型.所以你应该写一些例子
( char * )a + i * size_t
代替
a+((i)*size_t)
当函数搜索最小值然后在此语句中的条件
if (memcmp(b, a+((i)*size_t), size_t) < 0) {
应该写得像
if ( memcmp( ( char * )a + i * size_t, b, size_t ) < 0)
考虑到所有这些,功能可能看起来像
void returnMinAddress( void *a, void *b, size_t n, size_t m) { memmove(b, a, m); for (size_t i = 1; i < n; i++) { if ( memcmp( ( char * )a + i * m, b, m ) < 0 ) { memmove(b, ( char * )a + i * m, m ); } } }
但是还有一个问题是函数无法解决.被认为是原始字节序列的负整数可能大于正数.因此,如果您将尝试上面显示的数组函数
int a[8] = { 3, 2, 1, -4, 6, 9, 8, -1 };
你会得到最小值等于1
而物流等于-4
.
编写这种通用函数的方法之一如下
#includevoid * returnMinAddress( const void *a, size_t n, size_t m, int cmp( const void *, const void *) ) { const void *min = a; for (size_t i = 1; i < n; i++) { if ( cmp( ( const char * )a + i * m, min ) < 0 ) { min = (const char *)a + i * m; } } return (void *)min; } int cmp_int(const void *p1, const void *p2) { int a = *(const int *)p1; int b = *(const int *)p2; return (b < a) - (a < b); } int main( void ) { int a[8] = { 3, 2, 1, -4, 6, 9, 8, -1 }; int *b = returnMinAddress(a, 8, sizeof(int), cmp_int); printf("The result is : %d\n", *b); }
程序输出是
The result is : -4