Tag: malloc

我应该如何malloc / realloc与包含数组的结构?

我对c很新,所以如果我的步骤有误,请告诉我。 假设我有以下内容: struct graphNode{ int val; graphNode* parent; int succSize; int succMaxSize; graphNode* succ[1]; }; 我将创建一个新节点: graphNode *n; n = malloc(sizeof(struct graphNode)); assert(n); n->val = 1; n->parent = NULL; n->succSize = 0; n->succMaxSize = 1; 然后,如果我想向节点添加后继 if (n->succSize == n->succMaxSize){ n->succ = realloc(n->succ, sizeof(graphNode*) * n->succMaxSize * 2); n->succMaxSize *= 2; } n->succ[succSize] = n2; […]

第一个元素偏移

它是保证,结构的第一个元素的偏移是0吗? 为了更准确,我们考虑一下 struct foo { int a; double b; }; struct foo *ptr=malloc(sizeof(struct foo)); int *int_ptr = &ptr->a; free(int_ptr) 在任何操作系统或任何其他因素下,它是否始终有效?

如何释放一个char指针数组?

我使用此方法将列表中的值转换为数组,以便在execvp()中使用 – 系统调用: char **list2argarray(struct shellvalue *values, int count) { char **array = (char **)malloc((count + 1) * sizeof(char *)); int i = 0; while (values) { char *word = values->word; array[i] = (char *)malloc(sizeof(word) + 1); strcpy(array[i], word); values = values->next; i++; } array[i] = NULL; return array; } 什么是释放这些数组的正确方法? 我试过像这样的东西 void freeargpointer(char **array, […]

用valgrind检查fftw3

在我的程序的一个步骤中,我需要卷积图像。 为此,我使用fftw3提供的function。 当我在我的程序上运行valgrind ,我得到了这个堆栈跟踪。 我的函数叫做fftw3 ,它运行fftw3的fftw_plan_dft_r2c_2d两次(一次在图像上,一次在卷积内核上。为了使它更具可读性,我删除了所有地址和进程ID。 HEAP SUMMARY: in use at exit: 62,280 bytes in 683 blocks total heap usage: 178,271 allocs, 177,588 frees, 36,617,058 bytes allocated 3,304 (24 direct, 3,280 indirect) bytes in 1 blocks are definitely lost in loss record 129 of 131 at : malloc (vg_replace_malloc.c:291) by : fftw_malloc_plain (in ./prog) by […]

填充动态分配的字符串数组?

我有以下代码来填充字符串数组,但每次更改值时,整个数组都会更改(而不是单个字符串数组)

为什么应用程序无法访问来自共享库的malloc内存?

我维护一个用C语言编写的库,用户可以在Linux上直接从Python使用加载共享库和调用函数的模块访问。 该模块是非常常用的,正如这个版本的共享库一样,人们在做一个流行的教程 。 用户正在获得分段错误。 在gdb下运行他的Python脚本,他发现它位于共享库中,在一个函数内,为一个结构的mallocs内存并返回指针。 他正在返回指针,但当他尝试在后续调用共享库时使用它时,会发生分段错误,因为内存不可访问。 如果他以root身份运行Python脚本,则不会发生此问题。 它也不会出现在备用Linux安装中。 所以回顾一下: 他的Python代码加载了共享库。 然后它调用一个函数,该函数返回指向共享库中分配的内存的指针。 然后他调用共享库中的另一个函数,并传入它返回给他的指针,共享库扼杀它自己的指针。 它只发生在“4.0.7-2-ARCH x86_64 GNU / Linux”上作为普通用户运行时。 当他切换到root并运行它时,该操作系统上不会发生这种情况。 当他试图在Ubuntu机器上重现问题时不会发生这种情况。 是什么赋予了? 这是一些ARCH错误吗? 或者是否存在可以清除的编程细微差别? 您可以在这里阅读细节,其中包含足够的细节来重现问题,如果问题对于具有比我更多Linux编程经验的用户来说不是不言而喻的。 指向共享库函数的快速链接: TCOD_map_new的源代码。 TCOD_map_set_properties的源代码。 他的Python代码摘录为后代和易于访问: #!/usr/bin/env python2 import curses import libtcodpy as libtcod def main(stdscr): curses.start_color() curses.use_default_colors() map = libtcod.map_new(10, 10) # any numbers work libtcod.map_set_properties(map, 0, 0, True, True) # any in […]

我们可以重用已分配的内存

这是对这个问题的跟进。 在解释我的问题时,我声明分配的内存可以重用,因为它没有声明的类型,我被告知它是不正确的C. 这是一个说明问题的代码示例: #include #include #include #include struct Elt { int id; char name[32]; }; struct Elt2 { double val; char name[16]; }; static_assert(sizeof(struct Elt2) id, elt->name); struct Elt2 *elt2 = (void *) elt; // declares a new pointer to a shorter type memcpy(elt2, &actual2, sizeof(*elt2)); // effective type is now struct Elt2 printf(“elt2: %g […]

Realloc和sscanf成为一个函数

我有一个有num行的文件:每行包含一个数字。 我想将每个数字保存到矢量*vet 。 为什么这段代码不起作用? Segmentation fault (core dumped) 我认为错误是save_numbers函数中的sscanf ,但我不知道为什么。 #include #include /* This function allocate memory and save numbers into a vector */ int save_numbers (int **vet, int *num) { FILE *fin; int i = 0; char buff[10]; if ( !(fin = fopen(“numbers.dat”, “r”)) ) return 1; while ( fgets(buff, sizeof(buff), fin) ) { […]

使用malloc循环来保证malloc的结果是不是很糟糕?

像这样分配内存是不好的做法吗?: FOO *foo; while (!(foo = malloc(sizeof(FOO)))) ;

在空间函数之外的空闲内存,它被分配

我有一个无效function void foo(int *ptr) { //trying to allocate memory to hold 5 ints ptr = malloc(sizeof(int)*5): //I loop ptr and assign each with a value i =0 to 4; } 在主要function我有这条线 int main() { int *num; //I called the function foo(&(num)); free(num); return 1; } 我得到munmap_chunk()无效指针错误。 我确实试图挖掘更多信息,但我无法弄清楚这一点。 我知道这对那些在c工作的人来说是基本的。 我以为我通过引用传递它应该工作,但事实并非如此。 我是C的新手,到目前为止一直很头疼。