当前位置: 首页 > 知识库问答 >
问题:

C语言中的动态数组-我对malloc和realloc的理解正确吗?

麹高义
2023-03-14

我正在学习如何在C中创建动态1D数组。下面的代码尝试执行以下操作:

  1. 使用malloc,创建长度为10动态数组,该数组保存类型为double的值

测试:

 double* data = (double*)malloc(10*sizeof(double));

 for (j=0;j<10;j++)
 {
      data[j]= ((double)j)/100;
      printf("%g, ",data[j]);
 }

 printf("\n");

 data = (double*)realloc(data,11*sizeof(double));

 for (j=0;j<11;j++)
 {
     if (j == 10){ data[j]= ((double)j)/100; }
     printf("%g, ",data[j]);
 }

 free((void*) data);

问题

>

  • 我的编码正确吗?

    我找到的教程使用malloc而不把(双*)放在前面。例如,

    int*指针<指针=malloc(2*sizeof(int));

    在VisualStudio2010和Windows7上,我无法编译此文件。错误消息是

    void类型的值不能分配给int类型的实体。

    为什么它适用于那些教程而不适用于我?我猜这是因为在我的示例中,他们使用的编译器会自动为他们填写(int*)

  • 共有3个答案

    呼延才
    2023-03-14

    在C语言中,不应该转换malloc()返回值。

    此外,在malloc()参数中对类型进行编码也是一个坏主意。这是一个更好的方法:

    double* data = malloc(10 * sizeof *data);
    
    能翔宇
    2023-03-14

    1)我的编码正确吗?

    主要地但是data=(double*)realloc(data,11*sizeof(double))丢失对已分配内存的引用如果realloc失败,则应使用临时指针保持realloc的返回值,并检查其是否为NULL(还应检查malloc的返回值)。

    2) 我发现的教程使用malloc时没有将(双*)放在前面。

    在C语言中,malloc返回一个可以隐式转换为任何其他指针类型的space*,因此不需要强制转换(并且由于强制转换可以隐藏错误而被广泛劝阻)。Visual Studio显然将代码编译为需要强制转换的C。

    公孙黎昕
    2023-03-14

    你很接近了。

    在C语言中(至少从1989年版本的标准开始),在mallocrealloc之前的强制转换是不必要的,因为C可以在没有强制转换的情况下将类型space*的值转换为int*。这对C来说不是真的,所以根据您得到的错误,听起来像是您将代码编译为C而不是C。检查VS2010的留档,以确定如何将代码编译为C。

    以下是我编写malloc调用的首选样式:

    double *data = malloc(10 * sizeof *data);
    

    由于表达式*data的类型是doublesizeof*data相当于sizeof(double)。这也意味着,如果数据的类型发生变化,您不必调整malloc调用。

    对于realloc调用,将结果分配给临时指针值更安全。如果不能扩展缓冲区,realloc将返回NULL,因此编写更安全

    double *tmp;
    ...
    tmp = realloc(data, 11 * sizeof *data);
    if (!tmp)
    {
      // could not resize data; handle as appropriate
    }
    else
    {
      data = tmp;
      // process extended buffer
    }
    

    请注意,微软对C语言的支持随着1989年版本的语言而结束;从那以后,对语言标准进行了两次修订,引入了一些新功能,并弃用了旧功能。因此,虽然一些C编译器支持C99功能,如混合声明和代码、可变长度数组等。,VS2010不会。

     类似资料:
    • 主要的困惑是:第一个代码不管它的错误,仍然可以修改数组元素,而第二个代码,不能修改数组元素;因为两个函数都传递数组的地址;我们通过地址来操作数组元素

    • 我在使用malloc和calloc创建动态数组时遇到问题。 输出是 你能告诉我我做错了什么吗?

    • 主要内容:对数组的总结,关于查找和排序数组(Array)是一系列相同类型的数据的集合,可以是一维的、二维的、多维的;最常用的是一维数组和 二维数组,多维数组较少用到。 对数组的总结 1) 数组的定义格式为: type 为数据类型,arrayName 为数组名,length 为数组长度。 需要注意的是: 数组长度 length 最好是常量表达式,例如 10、20*4 等,这样在所有编译器下都能运行通过;如果 length 中包含了变量,

    • 数组是编程语言中用来存储元素的集合。在 C 语言中,集合是储存相同类型元素的集合。并且可以通过一个名称来来访。 -------------------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | …… | N-1 | -------------------------------------------- 第一个元素

    • 问题内容: 我一直对会话在内部的工作方式感兴趣,但是我对C的知识很少(并且不确定在PHP源代码中的位置)。 这是我目前对会话的了解: 当您启动会话时,将为用户分配一个会话ID,该ID存储在cookie中。 会话数据保存(通过)后,将与相关的会话ID和到期时间一起存储在文件系统中。 它是否正确?另外,创建会话ID的方法是什么?我认为这是基于时间的,但是如果两个用户同时发送请求该怎么办?内部采用什么方

    • 本文向大家介绍详解C语言中的字符串数组,包括了详解C语言中的字符串数组的使用技巧和注意事项,需要的朋友参考一下 在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。 总结 以上所述是小编给大家介绍的C语言中的字符串数组,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回