【发布时间】:2015-09-23 18:58:22
【问题描述】:
对于函数
isqroot(),使用巴比伦方法计算平方根,精度为一级,并在结构中返回。
我无法将值返回给结构,并且当我编译它时返回垃圾值。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct rootStruct {
int rootInt;
int rootFraction;
};
typedef struct rootStruct RootStruct;
RootStruct* isqroot (int n) {
/*We are using n itself as initial approximation*/
RootStruct* root=(RootStruct* )malloc(sizeof(RootStruct));
float x = n;
float y = 1;
float e = 0.1; /* e decides the accuracy level*/
while(x - y > e) {
x = (x + y)/2;
y = n/x;
}
root->rootInt = (int)x/2;
root->rootFraction = (int)(x-root->rootInt)*100;
return root;
}
int main(){
RootStruct* roo+t=(RootStruct* )malloc(sizeof(RootStruct));
printf("the sqrt is %d\n%d\n",root->rootInt,root->rootFraction);
return 0;
}
这段代码有什么问题?
【问题讨论】:
-
它甚至编译了吗?你甚至没有调用你的函数。
-
在您的设计中,您分配少量内存来保存生成的根。如果你用
malloc分配内存,你也必须free它,这很繁琐。与数组不同,结构可以作为值传递,因此您可以在没有指针和额外内存管理开销的情况下重写此代码。 -
@MOehm,传递一个大于某个非常小的大小的结构会导致对 memcpy() 的许多隐藏调用,并留出内存供 memcpy() 调用使用。该内存不能用于其他任何事情。 IE。通过传递整个结构来传递结构是一种非常糟糕的做法。将指针传递给结构是一种更好的做法。
-
在调用系统函数
malloc()时,始终检查(!=NULL)返回值以确保操作成功 -
@user3629249:有问题的结构“称重”两个整数,相当于现代系统中指针的大小。我怀疑它是通过
memcpy复制的。另请注意,没有传入结构,而是返回了一个结构。在此处返回指针会产生进一步的后果:指针必须指向静态内存或新分配的内存。静态内存意味着结果被后续调用覆盖;分配的内存意味着调用代码必须显式地释放它。在我看来,如果你想保留x = sqrt(8)语义,在这里返回一个结构是更好的选择。