首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面的C语言代码有什么问题?

下面的C语言代码有什么问题?
EN

Stack Overflow用户
提问于 2017-03-15 08:20:03
回答 4查看 554关注 0票数 0

我注意到,在行int *x = malloc(sizeof(int));中,这段代码试图在不使用正确的类型转换的情况下将空*转换为int*。所以按照我的说法,答案应该是选项A。但是在2017年的正式考试答案中,答案是D。那么我错了吗?怎么做?

代码语言:javascript
复制
#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();
}
  • (A)编译器错误,因为malloc的返回不是适当的类型广播。
  • (B)编译器错误,因为比较应该以x==NULL格式进行,而不是如图所示。
  • (C)编译成功,但执行可能导致指针悬空。
  • (D)编译成功,但执行可能导致内存泄漏。

在我看来,只有在使用int *x = (int *)malloc(sizeof(int));时,选项D才是正确的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-15 08:27:19

在所提供的选择中没有正确的答案。

在假定代码应该用标准C编写的情况下,代码立即出现了明显的问题:

  • 标准库没有<conio.h>头或<iostream.h>头。
  • void main()是非法的。应该是int main()。更好的int main(void)
  • clrscr()getch() -标准库不知道这样的函数.
  • 第二个malloc泄漏第一个分配的内存(假设第一个成功)。
  • 第二次malloc的结果是显式的--糟糕和不必要的实践。
票数 6
EN

Stack Overflow用户

发布于 2017-03-15 08:25:34

声明:

代码语言:javascript
复制
int *x = malloc(sizeof(int));

不会导致编译错误,因为它将x声明为指向int的指针,并随后立即对其进行初始化。事先没有void型。

声明:

代码语言:javascript
复制
x = (int *)malloc(sizeof(int));

在重新分配已分配给x的内存时,可能会导致内存泄漏。

注意:然而,没有一个答案是完全正确的。由于各种原因,此代码将不会编译。

如果这是您的代码,请更改:

代码语言:javascript
复制
void main()

致:

代码语言:javascript
复制
int main(void)

还可以看到why you should not cast the result of malloc

除此之外,标准库不承认clrscr()getch()<conio.h><iostream.h>

票数 0
EN

Stack Overflow用户

发布于 2017-03-15 08:47:07

我注意到,在int * x =malloc行(sizeof( int ));这段代码试图将void*转换为int*,而不使用正确的类型转换。

malloc,但这是个文体上的问题。void *安全地提升到任何其他指针。

ISO C 6.3.2.3说.

指向空的指针可以转换为指向任何不完整类型或对象类型的指针,也可以从指针转换为指向对象类型的指针。指向任何不完整或对象类型的指针可以再次转换为无效指针和返回指针;结果应与原始指针相比较。

无论你选择什么,选一个并坚持下去。

内存泄漏在这里:

代码语言:javascript
复制
int *x = malloc(sizeof(int));
if(NULL==x) return;
x = assignval(x,0);
if(x){
    // Memory leak
    x = (int *)malloc(sizeof(int));

第一个mallocx指向已分配的内存。第二个malloc只能在第一个成功的情况下发生(如果x是真的)。指向第一个malloc分配的内存的指针丢失。

使用新变量将修复漏洞,同时要记住代码是胡说八道。

代码语言:javascript
复制
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认为这是一个错误。

代码语言:javascript
复制
test.c:8:1: error: 'main' must return 'int'
void main(){
^~~~
int
1 error generated.
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42804367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档