如何解决选择产生错误的函数C中的指针
所以我有3个函数,并且如果我在程序中调用这些函数,我需要告诉哪个函数会产生错误(关于使用指针)。这些功能是:
int* f1(void) {
int *p=0;
int x=10;
p = &x;
return p;
}
int* f2(void) {
int *px=0;
*px=10;
return px;
}
int* f3(void)
{
int* px = 0;
px = (int*)malloc(sizeof(int));
if ( px == 0) {
fprintf(stderr,"Error\n");
exit(EXIT_FAILURE);
}
*px=10;
return px;
}
我很确定f2是错误的。我需要选择以下变体之一:
1. f1 & f3
2. none of them
3. f1 & f2
4. all of them
我分析了f1和f3,在我看来它们没有错。我想念什么吗?
解决方法
- 在第一个功能中,
int* f1(void) {
int *p=0; // This defines an integer pointer with the value of 0x00.
int x=10; // This defines an integer variable storing the value 10 by default.
p = &x; // This assigns p with the address of the stack allocated memory block of x.
return p; // This returns the pointer stored in p.
}
此函数的问题在于,由于int x = 10;
是在堆栈中分配的,因此一旦函数超出范围,指针就会被释放。但是,由于您在分配地址之前没有做任何类似的操作,例如在引用指针之前将其解引用,或者为指针分配指向空空间的值,因此函数本身不会产生错误。但是,如果您要使用该函数返回的指针,则可能会导致堆栈损坏。
- 在第二个功能中,
int* f2(void) {
int *px=0; // This defines an integer pointer with the value of 0x00.
*px=10; // This assigns the value 10 to the memory block pointed by the pointer.
return px; // This returns the pointer.
}
在上述功能中,您为内存中不存在的值分配了一个值。这肯定会触发写访问冲突。并且该函数的返回值始终为0x00。
- 在第三个功能中,
int* f3(void)
{
int* px = 0; // This defines an integer pointer with the value of 0x00.
px = (int*)malloc(sizeof(int)); // This allocates memory in heap which might or might not be a successful allocation and you assign it to px.
if ( px == 0) { // This checks if the allocation was successful.
fprintf(stderr,"Error\n");
exit(EXIT_FAILURE);
}
*px=10; // This sets the value 10 to the memory block pointed by px.
return px; // This returns the pointer stored in px.
}
此函数在函数范围内以及该函数返回的值中都是正确的。唯一的警告是您必须取消分配已分配的内存块。
这意味着在这3个功能中,第3个功能是最正确的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。