我注意到,在行int *x = malloc(sizeof(int));中,这段代码试图在不使用正确的类型转换的情况下将空*转换为int*。所以按照我的说法,答案应该是选项A。但是在2017年的正式考试答案中,答案是D。那么我错了吗?怎么做?
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int *assignval(int *x, int val){
*x = val;
return x;
}
void main(){
clrscr();
int *x = malloc(sizeof(int));
if(NULL==x) return;
x = assignval(x,0);
if(x){
x = (int *)malloc(sizeof(int));
if(NULL==x) return;
x = assignval(x,10);
}
printf("%d\n",*x);
free(x);
getch();
}在我看来,只有在使用
int *x = (int *)malloc(sizeof(int));时,选项D才是正确的。
发布于 2017-03-15 08:27:19
在所提供的选择中没有正确的答案。
在假定代码应该用标准C编写的情况下,代码立即出现了明显的问题:
<conio.h>头或<iostream.h>头。void main()是非法的。应该是int main()。更好的int main(void)clrscr(),getch() -标准库不知道这样的函数.malloc泄漏第一个分配的内存(假设第一个成功)。malloc的结果是显式的--糟糕和不必要的实践。发布于 2017-03-15 08:25:34
声明:
int *x = malloc(sizeof(int));不会导致编译错误,因为它将x声明为指向int的指针,并随后立即对其进行初始化。事先没有void型。
声明:
x = (int *)malloc(sizeof(int));在重新分配已分配给x的内存时,可能会导致内存泄漏。
注意:然而,没有一个答案是完全正确的。由于各种原因,此代码将不会编译。
如果这是您的代码,请更改:
void main()致:
int main(void)还可以看到why you should not cast the result of malloc。
除此之外,标准库不承认clrscr()、getch()、<conio.h>和<iostream.h>。
发布于 2017-03-15 08:47:07
我注意到,在int * x =malloc行(sizeof( int ));这段代码试图将void*转换为int*,而不使用正确的类型转换。
malloc,但这是个文体上的问题。void *安全地提升到任何其他指针。
ISO C 6.3.2.3说.
指向空的指针可以转换为指向任何不完整类型或对象类型的指针,也可以从指针转换为指向对象类型的指针。指向任何不完整或对象类型的指针可以再次转换为无效指针和返回指针;结果应与原始指针相比较。
无论你选择什么,选一个并坚持下去。
内存泄漏在这里:
int *x = malloc(sizeof(int));
if(NULL==x) return;
x = assignval(x,0);
if(x){
// Memory leak
x = (int *)malloc(sizeof(int));第一个malloc将x指向已分配的内存。第二个malloc只能在第一个成功的情况下发生(如果x是真的)。指向第一个malloc分配的内存的指针丢失。
使用新变量将修复漏洞,同时要记住代码是胡说八道。
int *x = malloc(sizeof(int));
if(NULL==x) return;
x = assignval(x,0);
if(x){
int *y = malloc(sizeof(int));
if(NULL==y) return;
y = assignval(y,10);
free(y);
}顺便提一下,void main()是,技术上是,不是违反ISO标准,它是“其他一些实现定义的方式”。
5.1.2.2.1说:
在程序启动时调用的函数名为main。该实现没有声明此函数的原型。它应定义为返回类型int,且不带参数: { /* . */ } 或者有两个参数(这里称为argc和argv,但可以使用任何名称,因为它们是声明它们的函数的本地名称): int main(int argc,char argv[]) {/. */ } 或其他一些实现定义的方式()。
我猜您使用的是Windows编译器,这将是“其他实现”。clang认为这是一个错误。
test.c:8:1: error: 'main' must return 'int'
void main(){
^~~~
int
1 error generated.https://stackoverflow.com/questions/42804367
复制相似问题