我在C中有一个小任务.我正在尝试创建一个指向结构的指针数组.我的问题是如何将每个指针初始化为NULL?此外,在为数组成员分配内存后,我无法为数组元素指向的结构赋值.
#include <stdio.h>
#include <stdlib.h>
typedef struct list_node list_node_t;
struct list_node
{
char *key;
int value;
list_node_t *next;
};
int main()
{
list_node_t *ptr = (list_node_t*) malloc(sizeof(list_node_t));
ptr->key = "Hello There";
ptr->value = 1;
ptr->next = NULL;
// Above works fine
// Below is erroneous
list_node_t **array[10] = {NULL};
*array[0] = (list_node_t*) malloc(sizeof(list_node_t));
array[0]->key = "Hello world!"; //request for member ‘key’ in something not a structure or union
array[0]->value = 22; //request for member ‘value’ in something not a structure …Run Code Online (Sandbox Code Playgroud) 我在接受采访时问过这个问题:
在C++中,
- 如果我们分配内存
malloc并使用它delete来释放分配的内存怎么办?- 如果我们使用
new并使用它来释放内存free怎么办?如果在代码中使用上述内容,我们将面临哪些问题?
我的回答是没有区别.这样说我是对的吗?
64位寻址的地址空间绝对是巨大的.我有一个程序,将有mmap几个内存块,每个大小为100 - 500 MB.我将不可避免地重新映射几次,这可能会导致可用的连续空间出现碎片.
无论空间出现什么碎片,对于可用的地址空间来说肯定会很小.
我的问题是:鉴于这些限制,在正常情况下,我可以期望所有mmap请求成功(即由于碎片而不会失败)吗?他们失败的原因是什么?
我知道堆本身没有整个空间,但我认为它占绝大多数.
Mac OS/Linux.
我已经看到很多代码在进行分配时检查NULL指针.这使代码变得冗长,如果没有一致地完成,只有当程序员感觉到它时,甚至不能确保程序在地址空间用完时不会崩溃.此外,如果程序无法进行更多分配,那么它无论如何都无法完成其功能,对吧?
所以我的问题是,对于大多数程序来说,根本不检查并且如果内存耗尽会让程序崩溃,这不是更好吗?至少代码更具可读性.
注意
我说的是在现代计算机上运行的桌面应用程序(至少2 GB的地址空间),而且绝对不会运行航天飞机,生命支持系统或BP的石油平台.最重要的是,我在谈论使用malloc但从未真正超过5 MB内存使用量的程序.
我现在必须尝试过20种方法.我真的需要帮助,无论我做什么,我都会收到与此类似的错误.
a value of type "int" cannot be used to initialize an entity of type "int (*)[30]"
Run Code Online (Sandbox Code Playgroud)
即这会让我这样一个错误
int(*array)[160] = malloc((sizeof *array) * 10);
Run Code Online (Sandbox Code Playgroud)
并做这样的事情
int** Make2DintArray(int arraySizeX, int arraySizeY) {
int** theArray;
theArray = (int**) malloc(arraySizeX*sizeof(int*));
int i;
for (i = 0; i < arraySizeX; i++)
{
theArray[i] = (int*) malloc(arraySizeY*sizeof(int));
}
return theArray;
}
Run Code Online (Sandbox Code Playgroud)
会得到我的
"void *(size_t)" in "memory.c" at line 239 and: "int()"
Run Code Online (Sandbox Code Playgroud)
有没有人有一个解决方案如何成功分配int [160] [10]的2dArray
我很惊讶我找不到任何文件说明Valgrind 工具的输出_int_malloc和malloc输出之间的区别callgrind.
有人可以解释一下他们的区别吗?
此外,我实际上编写C++代码,所以我完全new不使用malloc,但在callgrind输出中只显示mallocs.
假设我有一个为调用者分配内存的函数:
int func(void **mem1, void **mem2) {
*mem1 = malloc(SIZE);
if (!*mem1) return 1;
*mem2 = malloc(SIZE);
if (!*mem2) {
/* ... */
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在第二个malloc()失败的情况下,我想听听你对free()分配内存的最佳方法的反馈.你可以想象一个更复杂的情况,有更多的错误退出点和更多分配的内存.
我将使用两组char*(或字符串)读取strtok,并且因为这两组字符是相关的,(address : command\n)所以我决定使用一个结构.
struct line* array = (struct line*)malloc(sizeof(file) * sizeof(struct line*));
Run Code Online (Sandbox Code Playgroud)
这个malloc函数的行间空间给了我一个分段错误,并想知道你是否可以告诉我一个适当的malloc空间方式.对于上下文,这是我的其余代码:
struct line
{
char* addr;
char* inst;
};
while loop{
x = strtok(line,": ");
y = strtok(NULL,"\n");
strcpy(array[i].addr,x); //assume that x and y are always 3characters
strcpy(array[i].inst,++y);
i++;
}
Run Code Online (Sandbox Code Playgroud) C(和C++)包括一系列动态内存分配函数,其中大部分都是直观命名的,并且易于向程序员解释,并对内存有基本的了解.malloc()简单地分配内存,同时calloc()分配一些内存并急切地清除它.还有,realloc()并且free(),这是非常不言自明的.
malloc()也提到的联机帮助页valloc(),它分配与页边框对齐的(size)字节.
不幸的是,我的背景在低级错综复杂方面不够彻底; 分配和使用页面边界对齐的内存有什么影响,什么时候这是适当的,而不是常规malloc()或calloc()?