【问题标题】:pointer to struct var指向结构变量的指针
【发布时间】:2017-08-27 13:20:39
【问题描述】:

嘿)我有成员作为指针的结构, 我也想创建结构变量作为指针。

我希望 malloc() 中的效率,我们不将 struct var 存储在堆栈中,并在 HDD 中保留可执行文件“a.out”字节少。仅动态内存使用。请检查,这个程序可以写成更有效的方式吗?我对记忆的看法正确有效吗?谢谢!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct pbookInfo { // define the struct pbookInfo here
    char * title;
    char * author;
};

int main(){

/* vars */

    char esc = 'X'; // exit point
    int i; // for loop counter

    // struct with member as * pointers, and struct var as * pointer
    struct pbookInfo * books; // struct var pointer

/* code - memory allocation */
    books = (struct pbookInfo *)malloc(sizeof(struct pbookInfo)); // memory for struct var
    // if memory fail
    if(books == 0){
        puts("\nmallocate fail - memory not enough");
        exit(1);
    }
    books -> title = (char *)malloc(10); // memory for member 'title'
    books -> author = (char *)malloc(5); // memory for member 'autor'
    // if memory fail
    if(books->title == 0 || books -> author == 0){
        puts("\nmallocate fail - memory not enough");
        exit(1);
    }

/* some expression mock, for example: */
    strcpy(books->title,"Storenth");
    strcpy(books->author,"Kira");

    // mock

/* allocated memory free */
    free(books->title);
    free(books->author);
    free(books);
    puts("All memory free!");

// exit point
    puts("\nexit point:");
    scanf(" %c", &esc);
    return 0;
}

【问题讨论】:

  • 为初学者声明struct pbookInfo { // define the struct pbookInfo here char title[10]; char author[5]; };,而不是为标题和作者字段分配固定大小。或者先计算大小,然后 malloc。
  • 与间距保持一致。点 . 运算符或箭头 -&gt; 运算符周围不应该有空格。它们结合得非常紧密。

标签: c pointers struct


【解决方案1】:

在堆栈上声明变量不会影响可执行文件 (a.out) 的大小,除非您声明常量或字符串常量。与使用 malloc() 相比,在堆栈上声明变量更快。当需要分配大量内存并且该内存需要在函数调用之间持续存在时,使用动态内存分配。

【讨论】:

  • 你能用我上面源码的重新编码例子解释一下吗?
【解决方案2】:

一般来说,除非您需要保持数据持久性(即从函数返回后保持数据“活动”),否则没有必要使用malloc()。只有当您必须操作可变大小的数据副本或有时用于线程安全函数时,您才真正需要它。

malloc() 不是为单个临时变量获取内存的有效方法,并且还会带来调用 free() 以在返回之前撤消它的开销。所以它很慢。

还要注意,很容易忘记free() 分配的内存,这就是发生内存泄漏的原因。因此,无缘无故地引入malloc() 只会增加更多潜在的错误。

简单地声明局部变量实际上没有开销,因为空间是由函数在调用时自动分配的,并且所有局部变量的空间都是在一个操作中分配的(只是在堆栈)。

释放局部变量不需要任何代码(一个巨大的好处)并且成本为零,因为它只是作为单个操作的一部分被释放,以作为函数返回的一部分恢复堆栈。

使用malloc()free() 将需要更多的可执行空间。在堆栈上为局部变量保留空间(通常)在代码大小上是零开销。

【讨论】:

  • (只是在堆栈上保留一些空间)@StephenG 怎么样?你能举个例子吗?
  • 仅仅声明一个局部变量就是在堆栈上保留空间。
【解决方案3】:

首先请阅读why we shouldn't cast return value of malloc

我希望 malloc() 中的效率,我们不将 struct var 存储在 在 HDD 中堆叠并保留可执行文件“a.out”字节少。只有动态 内存使用。

那不是真的。自动数组比动态数组更有效。它们也更易于使用且不易出错。

只有在必要时才应该使用动态分配。就像你不知道输入数据的大小一样(自 以来仍有使用VLA 的方法)。

此外,更改存储自动动态不会影响可执行文件的大小。


为数组分配空间应如下所示(适应您要存储的数据大小)

books -> title = malloc(strlen("Storenth") + 1); // 1 for null terminating byte
books -> author = malloc(strlen("Kira") + 1);

strcpy(books->title,"Storenth");
strcpy(books->author,"Kira");

也花点时间想想著名的引文

过早的优化是万恶之源 -- DonaldKnuth

【讨论】:

  • strcpy(books-&gt;title,"Storenth"); 由于分配的内存太小导致UB。
  • 什么是自动数组?
  • 在栈上声明的数组,如char array[10];Here(click) 解释得很好。
  • 请注意,您也可以使用,例如,books -&gt; title = malloc(sizeof "Storenth");。这避免了函数调用,并且sizeof 表达式在编译时进行评估(在大多数情况下)。此外,空终止符的空间会自动包含在其中。
  • First please read why we shouldn't cast return value of malloc. 停止链接这个过时的古老建议。
猜你喜欢
  • 2021-10-15
  • 2012-02-07
  • 1970-01-01
  • 2018-08-28
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多