指向struct var

时间:2017-08-27 13:20:39

标签: c pointers struct

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

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

#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;
}

3 个答案:

答案 0 :(得分:0)

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

  

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

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

只有在必要时才应使用动态分配。就像你不知道输入数据的大小(从VLA开始,仍有使用的方法。)

同时更改存储空间自动&amp; dynamic 不会影响可执行文件的大小。

为数组分配空间应该看起来像(适应您要存储的数据大小)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

一般情况下,除非你需要保持数据持久(即从函数返回后保持“活着”),否则不必使用malloc()。如果你必须操纵大小可变的数据副本或有时用于线程安全功能,你真的只需要它。

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

另请注意,忘记free()分配内存非常容易,这就是内存泄漏的原因。因此,毫无理由地引入malloc()只会增加更多的漏洞潜力。

简单地声明局部变量几乎没有开销,因为调用时函数自动分配空间,局部变量的所有空间在一次操作中分配(仅保留一些空间)栈)。

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

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