嘿)我有成员作为指针的结构, 我也想创建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;
}
答案 0 :(得分:0)
首先请阅读why we shouldn't cast return value of malloc。
我希望malloc()中的效率我们不存储struct var 堆栈并在HDD中保留可执行文件“a.out”字节。只有动态 记忆使用。
那不是真的。自动数组比动态数组更有效。它们也更易于使用且不易出错。
只有在必要时才应使用动态分配。就像你不知道输入数据的大小(从VLA开始,仍有使用c99的方法。)
同时更改存储空间自动&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()
将在可执行文件中需要更多空间。在堆栈上为局部变量保留空间(通常)代码大小为零开销。