【发布时间】:2017-05-31 16:41:21
【问题描述】:
我正在尝试编写一个通用函数来获取整数或字符串数组中的最小元素。我正在使用记忆功能来做到这一点。以下是我写的代码:
编辑:修改代码 - 我从 int size_t 更改了 int size
/* Write a function that returns minimum values of an array of integers or strings */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}
【问题讨论】:
-
这是什么:
a+((i)*size_t)???它甚至可以编译吗?你知道size_t是一个类型名称吗? -
在执行
b = a;之后,您的memmove()将覆盖数组,而不是写入调用者的b变量。 -
旁注:除非您 100% 确定自己知道自己在做什么,否则不要对结构执行此操作。填充、魔术字节等将导致“相同”结构错误地使
memcmp()操作失败。 -
更一般地,不能依赖
memcmp()产生与应用于声明的指向对象类型的常规比较运算符等效的结果,除非被比较的对象是单独的unsigned chars. -
@EOF,我相当有信心这是一个范围界定问题。 OP 的
size_t的作用域是声明的函数;在那里,它可以隐藏相同标识符的文件范围类型定义。但从多个方面来看,它仍然是一种糟糕的形式。
标签: c arrays algorithm pointers